Spring bean作用域和生命周期.png

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、生命周期

Bean实例化过程

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:本人学识有限,欢迎指出错误,相互交流学习。


Freeze
4 声望0 粉丝