专栏首页LeorizonSpring 中Bean的作用域及生命周期
原创

Spring 中Bean的作用域及生命周期

Spring Bean对象的作用域:

在Spring容器中管理的Bean对象,可以在声明时通过scope属性或者相关注解指定其作用域

在Spring容器中,Bean对象的作用域一共有5种:singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、global-session(全局会话)。

Bean的五种作用域

其中最常用的是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框架进行使用,在这里不做深入了解;

Bean的生命周期

在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中还提供了一种延时加载机制,以此来提高系统资源的有效使用。

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>


原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring知识整合 —— Spring概述篇

    Spring 是一个轻量级的Java 企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Sprin...

    Leorizon
  • Spring IOC 及 Spring 中Bean的三种创建方式

    SSM开源框架是现在市场上主流的Java开发框架,其中包含了Spring、SpringMVC以及Mybatis三大主要框架。在SSM框架中Spr...

    Leorizon
  • Kubernetes-V1.14.2 二进制编译部署(master节点部署篇)

    vim /usr/lib/systemd/system/kube-scheduler.service

    Leorizon
  • 一个 RNN 调研引发的点评推荐血案

    在这篇文章里,作者基于用户的评论内容,评估了十多种不同的 RNN 框架。这些 RNN 框架包括多层双向 GRU 和 LSTM,同时有 attention-bas...

    serena
  • win10 uwp 发布的时候 ILC 编译不通过

    在 UWP 的发布中,需要通过 ILC 将代码编译为 Native 代码,但是在发布的 Microsoft.NETCore.UniversalWindowsPl...

    林德熙
  • 科技评论模式乱弹Vol2(看完之后谁都可以写科技评论了)

    两个月前,我写了《科技评论模式乱弹Vol1》,第二部分一直拖到今天才写好。之所以去总结科技评论模式,主要是这几年看了太多科技评论,最后竟然发现科技评论竟然大同小...

    罗超频道
  • 记一次ssh登录异常 原

    开发同事报告使用某普通用户test无法远程登陆一台,报错“shell request failed on channel 0”。

    阿dai学长
  • 网络规划和设计

    见贤思齊
  • Android高德之旅(13)公交搜索

    在LBS系统中怎能少了公交这个角色,大多数城市中,主要的公共交通工具还是公交车,高德地图当然会有相应的api来查询公交信息,这篇文章就来记录下公交信息查询。

    大公爵
  • 「MoreThanJava」计算机系统概述

    当你开始想《复仇者联盟》时,通常你都不会考虑任何关于 "物理" 方面的东西,例如影片是存储在哪一种物理媒介(例如 DVD、电影胶卷)上,或者是播放影片所需的物理...

    我没有三颗心脏

扫码关注云+社区

领取腾讯云代金券