当前位置:   article > 正文

银行外包java面试题目,Spring系列,2024历年阿里Java面试真题

银行外包java面试题目,Spring系列,2024历年阿里Java面试真题

return “DiAutowireByName{” +
“service1=” + service1 +
“, service2=” + service2 +
‘}’;
}
}

这个类中有2个属性,名称为:

  • service1

  • service2

这两个属性都有对应的set方法。

下面我们在bean xml中定义2个和这2个属性同名的bean,然后使用按照名称进行自动注入。

diAutowireByName.xml

<?xml version="1.0" encoding="UTF-8"?>

上面注释认真看一下。

@1:定义了一个名称为service1的bean

@2:定义了一个名称为service2的bean

@3:定义diAutowireByName需要将autowire的值置为byName,表示按名称进行自动注入。

spring容器创建diAutowireByName对应的bean时,会遍历DiAutowireByName类中的所有set方法,然后得到set对应的属性名称列表:{“service1”,“service2”},然后遍历这属性列表,在容器中查找和属性同名的bean对象,然后调用属性对应的set方法,将bean对象注入进去

测试用例

package com.javacode2018.lesson001.demo6;

import com.javacode2018.lesson001.demo5.IocUtils;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class DiAutowireTest {

/**

  • 按照名称进行注入
    */
    @Test
    public void diAutowireByName() {
    String beanXml = “classpath:/com/javacode2018/lesson001/demo6/diAutowireByName.xml”;
    ClassPathXmlApplicationContext context = IocUtils.context(beanXml);
    System.out.println(context.getBean(“diAutowireByName”));
    }
    }

效果

运行diAutowireByName输出:

setService1->Service1{desc=‘service1’}
setService2->Service2{desc=‘service2’}
setService2->Service2{desc=‘service2-1’}
setService1->Service1{desc=‘service1’}
DiAutowireByName{service1=Service1{desc=‘service1’}, service2=Service2{desc=‘service2’}}
DiAutowireByName{service1=Service1{desc=‘service1’}, service2=Service2{desc=‘service2-1’}}

优缺点

按名称进行注入的时候,要求名称和set属性的名称必须同名,相对于硬编码的方式注入,确实节省了不少代码。

按照类型进行自动注入

用法

autowire设置为byType

spring容器会遍历x类中所有的set方法,会在容器中查找和set参数类型相同的bean对象,将其通过set方法进行注入,未找到对应类型的bean对象则set方法不进行注入。

需要注入的set属性的类型和被注入的bean的类型需要满足isAssignableFrom关系。

按照类型自动装配的时候,如果按照类型找到了多个符合条件的bean,系统会报错。

set方法的参数如果是下面的类型或者下面类型的数组的时候,这个set方法会被跳过注入:

Object,Boolean,boolean,Byte,byte,Character,char,Double,double,Float,float,Integer,int,Long,Short,shot,Enum,CharSequence,Number,Date,java.time.temporal.Temporal,java.net.URI,java.net.URI,java.util.Locale,java.lang.Class

来看看案例吧。

案例

DiByType.java

package com.javacode2018.lesson001.demo6;

/**

  • 按照类型自动注入
    */
    public class DiAutowireByType {
    public static class Service1 {
    private String desc;

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

@Override
public String toString() {
return “Service1{” +
“desc='” + desc + ‘’’ +
‘}’;
}
}

public static class Service2 {
private String desc;

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

@Override
public String toString() {
return “Service2{” +
“desc='” + desc + ‘’’ +
‘}’;
}
}

private Service1 service1;
private Service2 service2;

public Service1 getService1() {
return service1;
}

public void setService1(Service1 service1) {
System.out.println(“setService1->” + service1); //@1
this.service1 = service1;
}

public Service2 getService2() {
return service2;
}

public void setService2(Service2 service2) {
System.out.println(“setService2->” + service2); //@2
this.service2 = service2;
}

@Override
public String toString() {
return “DiByType{” +
“service1=” + service1 +
“, service2=” + service2 +
‘}’;
}
}

DiAutowireByType类中有2个set方法分别来注入Service1和Service2,两个set方法中都输出了一行文字,一会执行的时候可以通过这个输出可以看出set方法是否被调用了。

diAutowireByName.xml

<?xml version="1.0" encoding="UTF-8"?>

上面注释认真看一下。

@1:定义了一个名称为service1的bean

@2:定义了一个名称为service2的bean

@3:定义diAutowireByName需要将autowire的值置为byName,表示按名称进行自动注入。

spring容器创建diAutowireByName对应的bean时,会遍历DiAutowireByName类中的所有set方法,然后得到set对应的属性名称列表:{“service1”,“service2”},然后遍历这属性列表,在容器中查找和属性同名的bean对象,然后调用属性对应的set方法,将bean对象注入进去

测试用例

DiAutowireTest类中添加一个方法

/**

  • 按照set方法参数类型进行注入
    */
    @Test
    public void diAutowireByType() {
    String beanXml = “classpath:/com/javacode2018/lesson001/demo6/diAutowireByType.xml”;
    ClassPathXmlApplicationContext context = IocUtils.context(beanXml);
    System.out.println(context.getBean(“diAutowireByType1”));
    }

效果

运行diAutowireByType输出:

setService1->Service1{desc=‘service1’}
setService2->Service2{desc=‘service2’}
DiByType{service1=Service1{desc=‘service1’}, service2=Service2{desc=‘service2’}}

优缺点

相对于手动注入,节省了不少代码,新增或者删除属性,只需要增减对应的set方法就可以了,更容易扩展了。

注入类型匹配的所有bean(重点)

按照类型注入还有2中比较牛逼的用法:

一个容器中满足某种类型的bean可以有很多个,将容器中某种类型中的所有bean,通过set方法注入给一个java.util.List<需要注入的Bean的类型或者其父类型或者其接口>对象

将容器中某种类型中的所有bean,通过set方法注入给一个java.util.Map<String,需要注入的Bean的类型或者其父类型或者其接口>对象

来看个案例就懂了。

DiAutowireByTypeExtend.java

package com.javacode2018.lesson001.demo6;

import java.util.List;
import java.util.Map;

/**

  • 满足条件的bean注入到集合中(重点)
    */
    public class DiAutowireByTypeExtend {

//定义了一个接口
public interface IService1 {
}

public static class BaseServie {
private String desc;

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

@Override
public String toString() {
return “BaseServie{” +
“desc='” + desc + ‘’’ +
‘}’;
}
}

//Service1实现了IService1接口
public static class Service1 extends BaseServie implements IService1 {

}

//Service1实现了IService1接口
public static class Service2 extends BaseServie implements IService1 {
}

private List serviceList;//@1
private List baseServieList;//@2
private Map<String, IService1> service1Map;//@3
private Map<String, BaseServie> baseServieMap;//@4

public List getServiceList() {
return serviceList;
}

public void setServiceList(List serviceList) {//@5
this.serviceList = serviceList;
}

public List getBaseServieList() {
return baseServieList;
}

public void setBaseServieList(List baseServieList) {//@6
this.baseServieList = baseServieList;
}

public Map<String, IService1> getService1Map() {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

文末

我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档

  • 第一个要分享给大家的就是算法和数据结构

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第二个就是数据库的高频知识点与性能优化

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 第三个则是并发编程(72个知识点学习)

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

  • 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料

网易严选Java开发三面面经:HashMap+JVM+索引+消息队列

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

Dtnm-1712546946124)]

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/487159
推荐阅读
相关标签
  

闽ICP备14008679号