本文总结自,csdn-world_snow:Spring的延迟加载详解
ApplicationContext实现的默认行为就是在启动服务器时将所有singleton bean提前进行实例化(也就是依赖注入)。
立即加载
提前实例化意味着作为初始化过程的一部分,applicationContext实例会创建并配置所有的singleton bean。通常情况下这是一件好事,因为这样在配置中的任何错误就会被立刻实现(否则的话可能要话几个小时甚至几天)。
该bean默认的设置为:
<bean id="testBean" calss="cn.itcast.test.TestBean" lazy-init="false" />
lazy-init="false"
立即加载,表示在spring启动时,立刻进行实例化。
有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现初始化时被提前实例化,那么可以将bean设置为延时实例化。
延时加载
设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而是第一次向容器通过getBean索取bean时实例化的。
<bean id="testBean" calss="cn.itcast.test.TestBean" lazy-init="true" />
如果一个设置了立即加载的bean1
,引用了一个延时加载的bean2
,那么bean1
在容器启动时被实例化,而bean2
由于被bean1
引用,所以也被实例化,这种情况也符合延时加载的bean
在第一次调用时才被实例化的规则。
如果一个bean
的scope
属性为scope="pototype"
时,即使设置了lazy-init="false"
,容器启动时不实例化bean,而是调用getBean
方法实例化的。
另外说明
- init-method属性指定初始化时执行的方法
- distory-method属性指定bean销毁时执行的方法。
使用注解的方式配置懒加载
@Component
@Lazy
public class Client {
//...
}