spring bean 有五种作用域、两种管理Bean生命周期的方式。
1、五种作用域
a、Singleton (缺省作用域、单例类型)
容器中只存在一个共享的Bean,只要id与Bean定义相匹配,那就会是同一个Bean。在容器启动(实例化)时Bean就实例化和初始化(可以通过lazy-init="true"来设置使得Bean被调用时才初始化)。
b、Prototype (原型类型)
对有状态的Bean建议使用Prototype,对无状态建议使用Singleton。
容器启动时并没有实例化Bean,只有获取Bean时才会被创建,并且每一次都是新建一个对象。
c、request(web的Spring ApplicationContext下)
每个HTTP 都会有自己的Bean,当处理结束时,Bean销毁。
d、session(web的Spring ApplicationContext下)
每一个Http session有自己的Bean
e、global session(web的Spring ApplicationContext下)
global session作用域类似于标准的HTTP Session作用域,不过仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
2、生命周期
a、单例管理的对象
Bean在容器启动时就会实例化和初始化,但是可以通过Bean的设置来设置对象的初始化时机
第一种:通过设置<bean>
<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" lazy-init="true"/>
第二种:通过设置<Beans>来修改所有bean默认方式的初始化时机
<beans default-lazy-init="true">
b、非单例管理的对象
Spring读取xml文件的时候,并不会立刻创建对象,而是在第一次请求该bean时才初始化(如调用getBean方法时)。容器只会实例化和初始化Bean,不会销毁Bean。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。在初始化后交由调用者管理
参考:https://blog.csdn.net/fuzhong...
这篇博客有更加详细介绍。
ps:本人学识有限,欢迎指出错误,相互交流学习。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。