详解SpringIOC容器中bean的作用范围和生命周期

bean的作用范围:
可以通过scope属性进行设置:

  • singleton 单例的(默认)
  • prototype 多例的
  • request 作用于web应用的请求范围
  • session 作用于web应用的会话范围
  • global-session 作用于集群环境的会话范围(全局会话范围)

测试:

<!-- 默认是单例的(singleton)-->
<bean id="human" class="com.entity.Human"></bean>
<bean id="human" class="com.entity.Human" scope="singleton"></bean>
@Test
 public void test(){
  //通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
  ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
  //获取Spring容器中的bean对象,通过id和类字节码来获取
  Human human = applicationContext.getBean("human", Human.class);
  Human human1 = applicationContext.getBean("human", Human.class);
  System.out.println(human==human1);
 }

结果:

将scope属性设置为prototype时

  <bean id="human" class="com.entity.Human" scope="prototype"></bean>

结果:

singleton和prototype的区别

  • 如果bean属性设置为singleton时,当我们加载配置文件时对象已经被初始化
  • 而如果使用prototype时,对象的创建是我们什么时候获取bean时什么时候创建对象

当设置为prototype时


当设置为singleton时

bean对象的生命周期

单例对象:

  • 出生:当容器创建时对象出生
  • 活着:只有容器还在,对象一直活着
  • 死亡:容器销户,对象死亡
  • 单例对象和容器生命周期相同

测试:
先设置属性init-method和destroy-method,同时在person类中写入两个方法进行输出打印

 public void init(){
  System.out.println("初始化...");
 }

 public void destroy(){
  System.out.println("销毁了...");
 }
<bean id="person" class="com.entity.Person" scope="singleton" init-method="init" destroy-method="destroy">

  </bean>

测试类:

@Test
 public void test(){
  //通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
  ClassPathXmlApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//  //获取Spring容器中的bean对象,通过id和类字节码来获取
  Person person = Context.getBean("person", Person.class);
  //销毁容器
  Context.close();
 }

结果:

总结:单例对象和容器生命周期相同

当属性改为prototype多例时

  • 出生:当我们使用对象时spring框架为我们创建
  • 活着:对象只要是在使用过程中就一直活着
  • 死亡:当对象长时间不用,且没有别的对象应用时,由java垃圾回收器回收对象

测试类:

@Test
 public void test(){
  //通过ClassPathXmlApplicationContext对象加载配置文件方式将javabean对象交给spring来管理
  ClassPathXmlApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
//  //获取Spring容器中的bean对象,通过id和类字节码来获取
  Person person = Context.getBean("person", Person.class);
  //销毁容器
  Context.close();
 }

结果:

总结:由于Spring容器不知道多例对象什么时候使用,什么时候能用完,只有我们自己知道,因此它不会轻易的把对象销毁,它会通过java垃圾回收器回收对象

到此这篇关于SpringIOC容器中bean的作用范围和生命周期的文章就介绍到这了,更多相关SpringIOC容器bean作用范围和生命周期内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解SpringIOC BeanDeifition

    BeanDefiton是什么? BeanDefition是Spring对POJO的抽象,通过BeanDefition来更好地创建.管理Bean. 定义 含义 beanClassName bean的类名.该属性并不总是对应着bean真正使用的类的名称.bean通过某个类的静态工厂方法生成,那么这beanClassName就是该类:bean通过工厂Bean生成,那么这里为null scope 作用域 singleton 或者 prototype lazyInit 是否懒加载 BeanFacotry中

  • 基于springioc bean 的几个属性介绍

    1.lazy-init="false" 默认值为false,指的是bean的创建时机的spring容器一启动就会加载这些类.有点是及时发现bean的相关错误,因为spring容器启动,bean也都会创建完毕,如果bean有什么差错都会报出,缺点就是如果bean对象的开销较大,那会提前占用内存. 如果设置为true,则等到spring容器去获取该bean的对象时才会创建.优缺点与false相反 2.scope="singleton" 默认值就是singleton,指的

  • 浅谈springioc实例化bean的三个方法

    1.构造器 也就是在上一篇讲的那个例子,调用默认的无参构造函数 2.静态工厂方法 1)创建需要执行的方法的类 public class HelloWorld { public HelloWorld(){ System.out.println("aaaa"); } public void hello(){ System.out.println("hello world"); } } 2)创建静态工厂 public class HelloWorldFactory { p

  • 详解SpringIOC容器中bean的作用范围和生命周期

    bean的作用范围: 可以通过scope属性进行设置: singleton 单例的(默认) prototype 多例的 request 作用于web应用的请求范围 session 作用于web应用的会话范围 global-session 作用于集群环境的会话范围(全局会话范围) 测试: <!-- 默认是单例的(singleton)--> <bean id="human" class="com.entity.Human"></bean&g

  • 详解Spring中Bean的作用域与生命周期

    目录 一.Bean的作用域 二.Bean的生命周期 使用代码演示Bean的生命周期 一.Bean的作用域 通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以使用Bean的scope属性为bean设置作用域. 语法格式:<bean id="别名" scope="作用域" class="对应实现类"> 作用域的种类:(sing) singleton和prototype区别:(该两种比较常用) ① singl

  • 浅谈Spring中Bean的作用域、生命周期

    本文主要探究的是关于Bean的作用域.生命周期的相关内容,具体如下. Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).prototype(原型).request.session和global session,5种作用域说明如下: 1.singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象.Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为

  • JVM详解之汇编角度理解本地变量的生命周期

    简介 java方法中定义的变量,它的生命周期是什么样的呢?是不是一定要等到方法结束,这个创建的对象才会被回收呢? 带着这个问题我们来看一下今天的这篇文章. 本地变量的生命周期 在类中,变量类型有类变量,成员变量和本地变量. 本地变量指的是定义在方法中的变量,如果我们在方法中定义了一个变量,那么这个变量的生命周期是怎么样的呢? 举个例子: public void test(){ Object object = new Object(); doSomeThingElse(){ ... } } 在上面

  • 一文详解Java线程的6种状态与生命周期

    目录 1.线程状态(生命周期) 2.操作线程状态 2.1.新创建状态(NEW) 2.2.可运行状态(RUNNABLE) 2.3.被阻塞状态(BLOCKED) 2.4.等待唤醒状态(WAITING) 2.5.计时等待状态(TIMED_WAITING) 2.6.终止(TERMINATED) 3.查看线程的6种状态 1.线程状态(生命周期) 一个线程在给定的时间点只能处于一种状态. 线程可以有如下6 种状态: New (新创建):未启动的线程: Runnable (可运行):可运行的线程,需要等待操作

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

    目录 1.Bean的作用域 1.1 被修改的Bean案例 1.2 为什么使用单例模式作为默认作用域 1.3 作用域 1.4 Bean的6种作用域 1.5 设置作用域 2.Spring执行流程和Bean的生命周期 2.1 Bean的生命周期 2.1.1生命周期演示 2.1.2 为什么要先设置属性,在进行初始化 1.Bean的作用域 1.1 被修改的Bean案例 原因:Bean的作用域默认是单例模式的,也就是说所有⼈的使⽤的都是同⼀个对象!之前我们学单例模式的时候都知道,使⽤单例可以很⼤程度上提⾼性

  • 详解SpringIOC容器相关知识

    一.前言 IOC控制反转,不是一种技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交给Spring框架来管理. 区别: 没有IOC的思路:若要使用某个对象,就必须自己负责去写对象的创建 IOC的思路:若要使用某个对象,只需要从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权交给了Spring框架. 好莱坞法则:Don't call me, I 'll call you 举例说明: 做菜,做蒜薹炒猪肉 你有两种做法: 第一种,自己养猪,然后种蒜薹

  • 深入了解Spring中Bean的作用域和生命周期

    作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 singleton 定义的 Bean 在 Spring 容器中只有一个实例,这也是 Bean 默认的作用域. 2)prototype 原型模式,每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例. 3)request 在一次 HTTP 请求中,容

  • 详解Java的Spring框架中bean的定义以及生命周期

    bean的定义 形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的<bean/>定义,已经看到了前几章的形式配置元数据创建. bean定义包含所需要的容器要知道以下称为配置元数据的信息: 如何创建一个bean Bean 生命周期的详细信息 Bean 依赖关系 上述所有配置元数据转换成一组的下列属性构成每个bean的定义. Spring配置元数据 Spring IoC

  • Spring中Bean的作用域与生命周期详解

    目录 一.Bean的作用域 1.单实例Bean声明 2.多实例Bean声明 二.Bean的生命周期 1.bean的初始和销毁 2.bean的后置处理器 总结 一.Bean的作用域 首先我们来讲一下有关于bean的作用域, 一般情况下,我们书写在IOC容器中的配置信息,会在我们的IOC容器运行时被创建,这就导致我们通过IOC容器获取到bean对象的时候,往往都是获取到了单实例的Bean对象, 这样就意味着无论我们使用多少个getBean()方法,获取到的同一个JavaBean都是同一个对象,这就是

随机推荐