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

目录
  • 一、Bean的作用域
  • 二、Bean的生命周期
    • 使用代码演示Bean的生命周期

一、Bean的作用域

通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以使用Bean的scope属性为bean设置作用域。

语法格式:<bean id="别名" scope="作用域" class="对应实现类">

作用域的种类:(sing)

singleton和prototype区别:(该两种比较常用)

① singleton单实例,prototype多实例

② 设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象

设置scope值是prototype时候,在加载spring配置文件时候暂时不会创建对象,在调用getBean方法时候才创建多实例对象

singleton作用域:

//Cat.java
public class Cat {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
}

配置文件beans5.xml

<bean id="cat" scope="singleton" class="com.jd.dao.Cat">
    <property name="name" value="大橘"></property>
</bean>

测试:

//Bean的作用域测试方法
@Test
public void catTest(){
    //1.初始化Spring容器,加载配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans5.xml");
    //2.通过Spring容器获取Bean的实例
    Cat cat1 = (Cat) applicationContext.getBean("cat");
    Cat cat2 = (Cat) applicationContext.getBean("cat");
    //3.输出获取的实例
    System.out.println(cat1);
    System.out.println(cat2);
}

prototype作用域:

将配置文件beans5.xml中的scope属性改为prototype,再次运行测试:

<bean id="cat" scope="prototype" class="com.jd.dao.Cat">
    <property name="name" value="大橘"></property>
</bean>

3测试:

二、Bean的生命周期

Bean从创建到销毁称为Bean的生命周期,大体上Bean的生命周期共有七步:

(1)通过无参构造器创建bean实例

(2)调用属性setter方法为bean的属性设置值

(3)把bean实例传递bean后置处理器的方法postProcessBeforeInitialization

(4)调用bean的初始化的方法(需要配置初始化的方法)

(5)把bean实例传递bean后置处理器的方法postProcessAfterInitialization

(6)获取使用已经创建的bean

(7)当容器关闭时候,调用bean的销毁的方法(需要配置销毁的方法)

注意:

① 初始化方法、销毁方法都需要在Bean中作为属性手动配置;

② 只有singleton作用域的Bean才会执行销毁方法;

使用代码演示Bean的生命周期

(1)普通Java Bean:Cat.java

public class Cat {
    private String name;
    public void setName(String name) {
        this.name = name;
        System.out.println("第二步:调用属性setter方法为bean的属性设置值");
    }
    public Cat(){
        System.out.println("第一步;通过无参构造器创建bean实例");
    }
    //初始化方法(在配置文件中配置实现调用)
    public void initMethod(){
        System.out.println("第四步:调用bean的初始化的方法");
    }
    //销毁方法(在配置文件中配置实现调用)
    public void destroyMethod(){
        System.out.println("第七步:当容器关闭时候,调用bean的销毁的方法");
    }
}

(2)myBeanPostProcessor实现BeanPostProcessor接口,实现后置处理器:myBeanPostProcessor.java

(spring中的AOP就是通过实现BeanPostProcessor接口实现的)

//myBeanPostProcessor实现BeanPostProcessor接口,实现后置处理器
public class myBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步:把bean实例传递bean后置处理器的方法");
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步:把bean实例传递bean后置处理器的方法");
        return bean;
    }
}

(3)配置文件:beans5.xml

<!--scope属性必须设置为singleton,否则创建的Bean不会被销毁-->
<!--init-method属性配置初始化方法,destroy-method属性销毁方法-->
<bean id="cat" scope="singleton" class="com.jd.dao.Cat" init-method="initMethod" destroy-method="destroyMethod">
    <property name="name" value="大橘"></property>
</bean>
<!--配置后置处理器,为当前配置文件中的所有bean添加后置处理器的处理-->
<bean id="myBeanPostProcessor" class="com.jd.dao.myBeanPostProcessor"></bean>

(4)测试

@Test
public void catTest(){
    //1.初始化Spring容器,加载配置文件
    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans5.xml");
    //2.通过Spring容器获取Bean的实例
    Cat cat = (Cat) applicationContext.getBean("cat");
    //3.输出获取的实例
    System.out.println("第六步:获取创建Bean实例"+cat);
    //4.手动关闭
    applicationContext.close();
}

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

(0)

相关推荐

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

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

  • SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    这篇文章主要介绍了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring beand的作用域 设置为singleton时,相当于一个类只能有一个实例,当再次申请时,返回的是同一个实例 可以看到两个bean实例的hashcode值是一样的,说明在此申请到的是同一个实例 将bean的作用域设置为prototype时,再次运行,可以看到,申请到的是两个不同bean实例 目前只学习

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

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

  • 详解Spring中Bean的生命周期和作用域及实现方式

    前言 在applicationContext.xml中配置完bean之后,Bean的声明周期状态有哪些.生命周期的各个阶段可以做什么.在applicationContext.xml配置bean的作用域有哪些.其中各个作用域代表的是什么.适用于什么情况.这篇文章做一个记录. 生命周期 初始化 可以直接查看图片,图片来自Spring Bean Life Cycle 从上图看出,Bean初始化完成包括9个步骤.其中一些步骤包括接口的实现,其中包括BeanNameAware接口,BeanFactoryA

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

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

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

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

  • 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的作用域默认是单例模式的,也就是说所有⼈的使⽤的都是同⼀个对象!之前我们学单例模式的时候都知道,使⽤单例可以很⼤程度上提⾼性

  • 详解Spring 中 Bean 的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上有对Bean声明周期的大致解释,但是没有代码分析,所以就自己上网寻找资料,一定要把这个Bean生命周期弄明白! ​ 网上大部分都是验证的Bean 在面试问的生命周期,其实查阅JDK还有一个完整的Bean生命周期,这同时也验证了书是具有片面性的,最fresh 的资料还是查阅原始JDK!!! 一.Bean 的完整

  • 详解Spring中Bean后置处理器(BeanPostProcessor)的使用

    目录 一.BeanPostProcessor接口 二.案例 三.总结 一.BeanPostProcessor接口 Bean后置处理:对Spring 工厂创建的对象进行二次加工处理,即预初始化和后初始化. PostProcessor中文意思就是后置处理器. BeanPostProcessor 接口也被称为Bean后置处理器,通过该接口可以自定义调用初始化前后执行的操作方法. 该接口中包含了两个方法:before方法(预初始化)和after方法(后厨是化) postProcessBeforeInit

  • 详解Spring中bean的几种注入方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入.依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Spring容器中支持的依赖注入方式主要有属性注入.构造函数注入.工厂方法注入.接下来将为大家详细介绍这三种依赖注入的方式以及它们的具体配置方法. 1.属性注入 属性注入即通过setXXX( )方法注入bean的属性值或依赖对象.由于属性注入方式具有可选择性和灵活性高的特点,因此它也是实际开发中最常用的注入方式

  • 详解Spring中bean生命周期回调方法

    生命周期回调方法 对于spring bean来讲,我们默认可以指定两个生命周期回调方法.一个是在ApplicationContext将bean初始化,包括注入对应的依赖后的回调方法:另一个是在ApplicationContext准备销毁之前的回调方法.要实现这种回调主要有三种方式:实现特定的接口.在XML配置文件中指定回调方法和使用JSR-250标准的注解. 1 实现特定接口 针对bean初始化后的回调和ApplicationContext销毁前的回调,Spring分别为我们了提供了Initia

随机推荐