《疯狂java 突破程序员基本功的16课》
Spring并不能从配置文件中读取bean的依赖关系,此时,若存在bean B依赖于bean A,则必须按下列顺序执行代码:
A a = (A) bf.getBean("a");
B b = (B) bf.getBean("b");
否则将出错。
替代方案之一是定义bean B时添加depends-on属性:
<bean id="a" class="..." />
<bean id="b" class="..." depends-on="a" />
替代方案之二是使用自动装配,Spring支持以下自动装配方式:
(1) byName,到BeanFactory中找到与属性名同名的bean;
(2) byType,到BeanFactory中找到与属性类别相同的bean;
(3) constructor,与byType类似,只是它使用构造方法而不是设置方法来进行注入,Spring只会匹配参数最多的构造方法。例如,假设有三个构造方法,A无参数,B有一个参数类型为TestClass,C有两个参数,类型分别为TestClass和TempClass,Spring在装配该类时,会首先到BeanFactory中寻找TestClass和TempClass,若均有,则匹配构造方法C;若只有TestClass,则匹配构造方法B;若均无,则匹配构造方法A;
(4) autodetect,从byType和constructor中自动选择,若bean有一个默认的(无参的)构造方法,则使用byType,否则使用constructor。
请在任何正式项目中不惜代价地避免自动装配。
当创建bean实例并关联依赖时,Spring默认不检查每个依赖bean的属性是否真的有值,但配置dependency-check时,可以有以下三种检查方式:
(1) simple,只检查基础类型及集合是否有值;
(2) objects,检查simple外的其他;
(3) all,检查所有。