在Spring容器中,Bean对象的作用域一共有5种:singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、global-session(全局会话)。
其中最常用的是singleton和prototype两种:
1)singleton(单例模式)
singleton是默认的作用域,当我们定义Bean时,如果没有给scope指定属性值,Spring会默认Bean的作用域为singleton。singleton属于单例模式,被singleton标识的对象具备全局唯一性,也就是在整个spring的容器中有且仅有一个该Bean的实例。
singleton的 配置文件如下:
<!-- 通过指定scope属性的值,来确定Bean的作用域 -->
<bean id="user" class="com.beans.User"
scope="singleton">
</bean>
2)prototype:这个作用域标识的对象每次获取调用都会创建新的对象
<!-- 通过指定scope属性的值,来确定Bean的作用域 -->
<bean id="user" class="com.beans.User"
scope="prototype">
</bean>
至于request(HTTP请求)、session(会话)、global-session(全局会话)三种作用域,用的话一般会配合SpringMVC框架进行使用,在这里不做深入了解;
在Spring框架应用中,所有的Bean对象都有生命周期,就是指Bean对象的创建,初始化,服务,销毁的这个过程,我们称之为Bean对象的生命周期;
在Spring配置文件中,我们可以通过配置init-method,destory-method的属性来指定Bean的生命周期方法。
<!-- 比如连接池的配置 -->
<bean id="cPool" class="com.beans.ConnectionPool"
scope="singleton"
init-method="init"
destroy-method="close">
</bean>
在链接池的配置中,我们可以为连接池指定由连接池提供的 init 和 close 的方法来给连接池对象指定生命周期。
在Spring中Bean对象的销毁是由Bean对象的作用域的配置来决定的:
1、singleton 作用域的对象可以在容器关闭时会由Spring调用对象的销毁资源的方法来销毁Bean对象;
2、prototype 作用域的对象可以由容器创建对象,初始化对象,但Spring容器不负责销毁。
另外在Spring框架应用中,容器初始化时会默认构建所有由Spring管理的对象,但如果这些对象长时间不使用还占着内存就会造成一定的资源浪费,为了解决这个问题,Spring中还提供了一种延时加载机制,以此来提高系统资源的有效使用。
1)在bean元素中将 lazy-init 属性的值设为 false,这种方式只对当前设置的单个bean元素有效:
<!-- 例如连接池的延时加载设置 -->
<bean id="cPool" class="com.beans.ConnectionPool"
scope="singleton"
init-method="init"
destroy-method="close"
lazy-init="false">
</bean>
2)在beans元素中将 default-lazy-init 属性的值设为 true ,这种方式用于指定 beans 标签中所有 bean 的延时加载策略。例如:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="cPool"
class="com.beans.ConnectionPool"
scope="singleton"
init-method="init"
destroy-method="destroy">
</bean>
</beans>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。