Spring Bean注入(setter方法注入的两种模式)
setter方法注入
a类中持有b类的引用,并且a类有b的set方法。在bean中添加<property>标签即可注入。实质上是将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方法注入,字段注入,方法注入,接口回调注入
本文地址:https://blog.csdn.net/qq_16375857/article/details/107896109