depends-on
如果一个bean
被另一个bean
引用,通常我们一般使用<ref>
标签来标记;
但是有时候,bean
之间的依赖关系并没有那么直接。比如:何时触发类中的静态初始值,例如用于数据库驱动程序注册。
depends-on可以显示强制的在使用该bean
之前初始化一个或多个bean
。
// 初始化多个bean的情况,只需要逗号隔开就行
<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" />
基于depends-on的特点,它其实可以控制初始化和销毁bean的顺序;
初始化的,假设A依赖B,那么B会在A之前创建,销毁的话,B会在A之后销毁
Lazy-initialized Beans
默认情况下,作为初始化过程的一部分,ApplicationContext
实现会立马创建和配置所有单例bean
。
这样可以避免,在数小时甚至数天后,才发现配置和环境错误。
如果想关闭这个默认行为,可以通过将bean
定义标记为延迟初始化来防止单例bean
的预实例化。
延迟初始化的bean
告诉IoC
容器在首次请求时而不是在启动时创建一个bean
实例。
xml文件的写法:
<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
特别注意:
当延迟初始化的
bean
是非延迟初始化bean
的依赖项时,ApplicationContext
会在启动时创建延迟初始化的bean
。
因为它必须满足单例的依赖关系。