当前位置:   article > 正文

2016-10-18-spring-bean何时被实例化_bean是不是相当于实例化一个类

bean是不是相当于实例化一个类

spring-bean何时被实例化

bean默认是singleton的,延迟加载为false

spring中bean默认是singleton的,延迟加载为false。即<bean scope="singleton”lazy-init="false">,如果想要一个类延迟实例化,那么将其的lazy-init="true"或改变其 scope(类的管理方式)。spring在服务器启动时就将所有的singleton的bean提前实例化,这个是在web.xml中配置的ContextLoaderListener做的。

图

默认情况下的测试

在ssh框架下,新建了3个类,UserDaoImpl,UserServiceImpl,UserAction,他们的空参构造方法中都写了一句话表示本类被初始化了。

启动服务器,三句话都被打印出来了,说明这三个bean在服务器启动的时候都被初始化了 – 延迟加载false。

图

两次调用的是同一个UserAction实例的save()方法 – 单例
图

修改action为prototype

但是因为struts2的action是不是单例的,线程安全的,效率比较低。

修改UserAction的scope为prototype原型,启动服务器,发现UserAction是没有被初始化的。
图

再次两次访问save方法。发现使用了prototype之后,生成两个UserAction实例
图

修改UserService的lazy-init设置为ture

继续修改代码,将UserService的lazy-init设置为ture。如下图,可以发现,现在只有UserDaoImpl被初始化了
图

修改了一下UserAction,在其中调用了UserService的save方法。此时访问save()方法,可以发现UserServiceImpl被初始化了。

spring文档:需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果IOC容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。

图

总结

  • spring管理的bean在默认情况下是会在服务器启动的时候初始化的(单例singleton且lazy-init为false)。
  • bean设置了scope为prototype(原型)之后,会每次使用时生产一个实例
  • bean设置了lazy-init="true"后,启动服务器不会马上实例化,而是在用到的时候被实例化。
  • 一个延迟实例化类被注射到一个非延迟实例化类中,也会在服务器其实时进行初始化
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/66322
推荐阅读
相关标签
  

闽ICP备14008679号