3.depends-on
(1) depends-on用来表示一个bean的实例化依靠另一个bean的先实例化,如果在一个bean A上定义了depends-on bean B就表示:bean A实例化前先实例化bean B。
<!-- 例一 -->
<beans ...>
<!-- 对于下面这俩个bean,谁先谁后创建不能确定 -->
<bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
<bean id="exampleB" class="cn.example.spring.boke.ExampleB"></bean>
</beans>
<!-- 例二 -->
<beans ...>
<!-- exampleB depends-on exampleA,因此exampleA会先于exampleB被创建 -->
<bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
<bean id="exampleB" class="cn.example.spring.boke.ExampleB" depends-on="exampleA"></bean>
</beans>
4.懒加载
(1) 默认情况下,Spring会在容器启动时初始化所有的singleton bean,因为在这种情况下,某些配置错误会尽早发现,但如果我们不想提前初始化bean,就可以指定bean的lazy-init属性,来延迟初始化bean,这样这个bean会在第一次请求时被初始化而非在容器启动时被初始化
<beans ...>
<!-- exampleA会在第一次请求时被初始化 -->
<bean id="exampleA" class="cn.example.spring.boke.ExampleA" lazy-init="true"></bean>
<!-- exampleB会在容器启动时被初始化 -->
<bean id="exampleB" class="cn.example.spring.boke.ExampleB"></bean>
</beans>
(2) 注意:当延迟初始化的bean是非延迟初始化的bean的依赖项时,延迟初始化就失效了,它也会在容器启动时被初始化,因为容器在启动时必须为这个非延迟初始化的bean注入依赖项
(3) 使用beans标签上的default-lazy-init属性批量设置延迟初始化的bean
<beans default-lazy-init="true">
<!-- 相当于给容器内的每一个bean都提供了lazy-init=true属性 -->
</beans>
4.自动装配
(1) 对于存在依赖关系的多个bean,我们可以通过ref属性来手动注入依赖项,同时,如果不想手动,可通过设置bean标签的autowire属性来开启Spring的自动装配功能,它会按照所给的策略来自动的注入依赖项,相较于手动装配,其具有自动更新配置,简化代码等优点,如下
<!-- 例一:手动装配 -->
<beans ...>
<bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
<bean id="exampleB" class="cn.example.spring.boke.ExampleB">
<!-- 使用ref来配置依赖项 -->
<property name="exampleA" ref="exampleA"></property>
</bean>
</beans>
<!-- 例二:自动装配 -->
<beans ...>
<bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>
<!-- autowire属性设置为byType,告诉容器来按照类型进行依赖项的注入 -->
<bean id="exampleB" class="cn.example.spring.boke.ExampleB" autowire="byType"></bean>
</beans>
(2) 自动装配策略,即autowire属性的取值:
策略 | 描述 |
---|---|
no | 默认选项,即不进行自动装配,bean之间的依赖关系通过指定ref属性来手动装配 |
byName | 根据属性名称进行自动装配,Spring会寻找与属性名同名的bean来进行装配,比如上面的例子中,exampleB对象有一个名为exampleA的成员变量,则Spring会在容器中寻找id为exampleA的这个bean进行注入 |
byType | 根据属性类型进行自动装配,如果容器中恰好存在一个同类型的bean,则会进行自动装配,如果存在多个,则会抛出异常,如果没有该类型的bean,则什么也不会发生,属性不会被注入 |
constructor | 类似于byType,不过针对的是构造函数参数进行的自动装配,如果容器中不存在类型跟构造函数参数的类型一样的bean时,将引发异常 |
此外,可通过byType或constructor策略,来对数组或集合进行自动装配,注入与类型相匹配的所有bean,如下
public class ExampleA {}
//ExampleB中存在一个类型为ExampleA的集合,希望通过这个集合来接收容器内所有类型为ExampleA的bean
public class ExampleB {
private List<ExampleA> exampleAList;
public void setExampleAList(List<ExampleA> exampleAList) {
this.exampleAList = exampleAList;
}
}
<!-- xml配置文件 -->
<