前面两篇文章描述了IoC容器中依赖的概念,包括依赖注入以及注入细节配置。本文将继续描述玩全部的依赖信息。
使用 depends-on
如果一个Bean是另一个Bean的依赖的话,通常来说这个Bean也就是另一个Bean的属性之一。多数情况下,开发者可以在配置XML元数据的时候使用<ref/>
标签。然而,有时Bean之间的依赖关系不是直接关联的。比如:需要调用类的静态实例化器来触发,类似数据库驱动注册。depends-on
属性会使明确的强迫依赖的Bean在引用之前就会初始化。下面的例子使用depends-on
属性来让表示单例Bean上的依赖的。
<bean id="beanOne" class="ExampleBean" depends-on="manager"/>
<bean id="manager" class="ManagerBean" />
如果想要依赖多个Bean,可以提供多个名字作为depends-on
的值,以逗号,空格,或者分号分割,如下:
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />
Bean中的
depends-on
属性可以同时指定一个初始化时间的依赖以及一个相应的销毁时依赖(单例Bean情况)。独立的定义了depends-on
属性的Bean会优先销毁,优于被depends-on
的Bean来销毁,这样depends-on
可以控制销毁的顺序。
延迟初始化的Bean
默认情况下,ApplicationContext
会在实例化的过程中创建和配置所有的单例Bean。总的来说,这个预初始化是很不错的。因为这样能及时发现环境上的一些配置错误,而不是系统运行了很久之后才发现。如果这个行为不是迫切需要的,开发者可以通过将Bean标记为延迟加载就能阻止这个预初始化。延迟初始化的Bean会通知IoC不要让Bean预初始化而是在被引用的时候才会实例化。
在XML中,可以通过<bean/>
元素的lazy-init
属性来控制这个行为。如下:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.foo.AnotherBean"/>
当将Bean配置为上面的XML的时候,ApplicationContext
之中的lazy<