Spring Bean注入

setter方法注入

a类中持有b类的引用,并且a类有b的set方法。在bean中添加标签即可注入。实质上是将b实例化,然后调用set方法注入。

包含以下两种模式:

手动模式:

xml资源配置元信息

java注解配置元信息

API配置元信息

自动模式:

byName

 根据属性名自动装配。BeanFactory查找容器中的全部Bean,找出其中id属性与属性同名的Bean来完成注入。如果没有找到匹配的Bean实例,则Spring不会进行任何注入。

byType

根据属性类型自动装配。BeanFactory查找容器中的全部Bean,如果正好有一个与依赖属性类型相同的Bean,就自动注入这个属性;但是如果有多个这样的Bean,就会抛出一个异常。如果没有匹配的Bean,则什么都不会发生,属性就不会被设置。如果需要无法自动装配时抛出异常,则设置dependency-check=”objects”。

构造器注入

a类中持有b类的引用,并且a的构造函数参数中有b。实质上就是通过构造函数注入,创建a对象时要把b对象传进去。

包含以下两种模式:

手动模式:

xml资源配置元信息

java注解配置元信息

API配置元信息

自动模式:

constructor(一种特殊的bytype模式)

集合类型注入

集合类型

数组类型(Array):原生类型,标量类型,常规类型,spring类型

集合类型:

Collection:list,set

Map:Properties

注意:

在没有@Autowired注解的情况下:

无参构造器将直接加入defaultConstructor集合中。

在构造器数量只有一个且有参数时,此唯一有参构造器将加入candidateConstructors集合中。

在构造器数量有两个的时候,并且存在无参构造器,将defaultConstructor(第一条的无参构造器)放入candidateConstructors集合中。

在构造器数量大于两个,并且存在无参构造器的情况下,将返回一个空的candidateConstructors集合,也就是没有找到构造器。

在有@Autowired注解的情况下:

判断required属性:

true:先判断requiredConstructor集合是否为空,若不为空则代表之前已经有一个required=true的构造器了,两个true将抛出异常,再判断candidates集合是否为空,若不为空则表示之前已经有一个打了注解的构造器,此时required又是true,抛出异常。若两者都不为空将放入requiredConstructor集合中,再放入candidates集合中。

false:直接放入candidates集合中。

判断requiredConstructor集合是否为空(是否存在required=true的构造器),若没有,将默认构造器也放入candidates集合中。

最后将上述candidates赋值给最终返回的candidateConstructors集合。

 

常见面试题:

有多少种依赖注入的方式?

构造器注入,setting方法注入,字段注入,方法注入,接口回调注入

 

 

你可能感兴趣的:(小马哥核心编程,spring,java)