[05] Bean的作用域和生命周期

1、Bean的作用域和初始化时间

之前我们稍微提到过,Spring中管理的Bean,默认都是单例模式,这意味着你多次获取某个对象,得到的都是相同的对象。单例作用域的显性写法如下,这和你不写scope属性的效果是一样的:

  1. <bean id="coder" class="dulk.learn.spring.Coder" scope="singleton" lazy-init="true"></bean>

既然说到了单例模式,还有scope属性,那么显而易见,也就还有其他的作用域:

类别     说明    
singleton     在Spring IOC 容器中仅存在一个Bean实例,Bean以单例的形式存在
prototype 每次从容器中调用Bean时,都返回新的实例,即每次调用getBean()时,相当于执行new XxxBean()的操作
request     每次HTTP请求都会创建一个新的Bean
(该作用域仅适用于WebApplicationContext环境)    
session     同一个HTTP Session共享一个Bean,不同HTTP Session使用不同的Bean
(该作用域仅适用于WebApplicationContext环境)
globalSession 同一个全局Session共享一个Bean,一般用于Portlet应用环境
(该作用域仅适用于WebApplicationContext环境)

插个题外话,看到这里应该能联想到了,我们常用的SSH三大框架组合,其中Struts的Action交给Spring作Bean管理,那么Action是哪种模式呢?默认是单例,意味着数据共享,这在多请求访问时显然是不合时宜的,所以常常配置的还是prototype。

而对于Bean的初始化,那么涉及到另一个属性,叫做“lazy-init”(懒加载),该标签在scope=singleton时影响Bean的实例化时间:

  • true:当第一次获取对象实例时创建对象
  • false:当容器加载时就创建对象
  • 默认default相当于false

2、Bean初始化和销毁方法

Spring在创建Bean实例后,会调用Bean配置的初始化方法。而在Spring容器关闭后,Bean不被容器调用,进入可垃圾回收阶段,那么在容器关闭之前,会调用Bean配置的销毁方法(只有scope=singleton的Bean才会执行销毁方法,如果是prototype,对象实例化后已经脱离了Spring的管理转交给调用者,Spring无法获取也就无谈销毁了)

在配置文件里,使用“init-method”和“destroy-method”属性,属性值为Bean的方法名称,如下:

  1. <bean id="Coder" init-method="init" destroy-method="destroy" class="dulk.learn.spring.Coder"></bean>
  1. public class Coder {
  2. ...
  3. public void init() {
  4. System.out.println("Coder init");
  5. }
  6. public void destroy() {
  7. System.out.println("Coder destory");
  8. }
  9. }
  1. public static void main(String[] args) {
  2. ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext.xml");
  3. Coder coder = (Coder) ac.getBean("coder");
  4. ac.close();
  5. }

原文地址:https://www.cnblogs.com/deng-cc/p/8877953.html

时间: 2024-08-26 01:35:58

[05] Bean的作用域和生命周期的相关文章

Spring之Bean的作用域与生命周期

在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性.该属性控制着bean对象的作用域.本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的. 一.Bean的作用域在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象.在BeanDefinition对象中有scope 属性,就是它控制着bean的作用域.Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的App

Spring bean的作用域和生命周期

bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3.对于singleton  spring容器只会创建一个共享实例,prototype则会创建不同的实例 bean的生命周期(bean自身的方法,bean级生命周期接口方法,容器级生命周期接口方法) 分为BeanFactory的生命周期和ApplicationContext的生命周期 1.对于BeanFactor

spring Bean的作用域、生命周期和后处理器

1. Bean的几种作用域 singleton 单例, 在整个spring IoC 容器只存在唯一对象 prototype 多例, 每次进行getBean 创建新的对象 request ,创建Bean, 放入request范围 request.setAttribute session ,创建Bean ,放入session范围 session.setAttribute globalSession 全局会话, 分布式多个系统, 共享同一个会话 单例Bean,在ApplicationContext对象

Spring bean的作用域以及生命周期

一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请求完毕之后,request里边的内容也将被释放点 . 简单说就是你在页面上的一个操作,request.getParameter()就是从上一个页面中的url.form中获取参数. 但如果一个request涉及多个类,后面还要取参数,可以用request.setAttribute()和request.

Spring中bean的作用域与生命周期

Spring中的bean 组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由IoC容器初始化.装配及管理的对象 Spring中的bean默认都是单例的(scope="singleton"默认值) 我们可以设置为多例(scope="prototype") bean的作用域 当scope="singleton"时 Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象

Spring-IOC:Bean的作用域、生命周期、XML的装配、注解注入、@Autowired

8. 使用注解开发 在spring4之后,要使用注解开发,必须要保证aop的包导入了. 使用注解需要导入context约束,增加注解的支持! <!--指定要扫描的包,这个包下的注解会生效--> <context:component-scan base-package="com.kuang.pojo"/> bean 属性如何注入 //等价于<bean id="user" class="com.kuang.pojo.User&qu

Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

spring作用、spring注解、管理对象的作用域与生命周期、自动装配

Spring 1. 作用 创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的! 2. Spring注解 在Spring中,定义了一系列的注解,可以取代几乎所有的XML配置! 尽管使用注解可以完成此前的许多配置,但是,基于Spring的项目仍需要Spring的配置文件! 2.1. 常用注解 使用注解的方式来创建和管理对象,首先,必须在Spring的配置文件中添加组件扫描: <!-- 组件扫描

MyBatis 作用域和生命周期

理解到目前为止所讨论的类的作用域和生命周期是非常重要的.如果使用不当可导致严重的并发性问题. SqlSessionFactoryBuilder  这个类可以在任何时候被实例化.使用和销毁.一旦您创造了SqlSessionFactory 就不需要 再保留它了.所以SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法 变量).您能重用SqlSessionFactoryBuilder 创建多个SqlSessionFactory 实例,但最好不要把 时间.资源放