spring 使用depends-on, lazy-init, defalut-lazy-init

depends-on

如果一个bean是另一个bean的依赖, 可以使用ref属性或者<ref/>标签来实现依赖

那么被依赖bean一定是要比依赖bean率先实例化, 而depends-on属性会使更明确,更强迫bean在引用前就会被初始化

depends-on是指指定Bean初始化及销毁时的顺序

使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,由于只有"singleton"Bean才能被Spring管理销毁,所以当指定的Bean都是"singleton"时,使用depends-on属性指定的Bean要在指定的Bean之后销毁

<bean id="helloApi" class="com.feng.spring.chapter2.helloworld.HelloApi">
</bean>
<bean id="decorator"  
    class="cn.javass.spring.chapter3.bean.HelloApiDecorator"  
    depends-on="helloApi">  
    <property name="helloApi"><ref bean="helloApi"/></property>  
</bean>

helloApi会先于decorator初始化

总结: depends-on指定的bean会比当前bean先初始化, 后销毁

当然, 哪怕不指定也不会报错, spring会初始化所有单例bean, 依赖关系的先后实例化问题也会被解决,只是使用depends-on会更加明确更加强迫

 

延迟加载bean

lazy-init

默认情况下, ApplicationContext会预初始化所有的单例bean. 

如果这个bean在开发过程中当前不需要的,并且自己又不想删去,担心万一以后需要, 可以将该bean标记为延迟加载来阻止预初始化,从而可以减少spring启动时间

当引用该bean时才被实例化, 如果作为单例的依赖时,它会随着单例bean的实例化而实例化.

<bean id="helloApi"  class="cn.javass.spring.chapter2.helloworld.HelloImpl"  lazy-init="true"/> 

总结: 延迟加载的bean只有被引用时才实例化

default-lazy-init

spring在启动的时候,会默认加载会默认加载整个对象实例图,从初始化ACTION配置、到 service配置到dao配置、乃至到数据库连接、事务等等。这样可以减少web服务器在运行时的负担,但是对于开发者来说无疑是效率极低的一个设置, 因为需要不断运行程序来测试代码

还好,spring提供了default-lazy-init属性

 

<beans default-lazy-init="true">
.....
</beans>

 

spring的默认配置是false, 当配置为true后,spring不会再去加载整个对象示例图,大大减少了初始化的时间,减少了spring的启动速度。

这样做只是为了在开发过程中节约启动时间,在部署到实际环境中,倒是没必要设置default-lazy-init为true。毕竟部署到实际环境中不是经常的事,每次启动1分钟倒不是大问题,而且可以提高服务器效率

 

当然,也不是所有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init  

 

posted @ 2022-02-27 21:06  binbin_cloud  阅读(62)  评论(0编辑  收藏  举报