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