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

 更新时间:2021年12月21日 14:43:16   作者:智商三岁半i  
Spring作为当前Java最流行、最强大的轻量级框架,受到了程序员的热烈欢迎。准确的了解Spring 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的作用域与生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    本文主要介绍了spring中BeanUtils.copyProperties的使用(深拷贝,浅拷贝),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 对java for 循环执行顺序的详解

    对java for 循环执行顺序的详解

    今天小编就为大家分享一篇对java for 循环执行顺序的详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • SpringBoot配置Apollo代码实例

    SpringBoot配置Apollo代码实例

    这篇文章主要介绍了SpringBoot配置Apollo代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java中的DTO的使用示例

    java中的DTO的使用示例

    在Java中,DTO代表数据传输对象,本文主要介绍了java中的DTO的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 1秒钟实现Springboot 替换/写入 word文档里面的文字、图片功能

    1秒钟实现Springboot 替换/写入 word文档里面的文字、图片功能

    这篇文章主要介绍了Springboot 替换/写入 word文档里面的文字、图片,1秒钟实现,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 使用SpringBoot自定义starter的完整步骤

    使用SpringBoot自定义starter的完整步骤

    这篇文章主要给大家介绍了关于使用SpringBoot自定义starter的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 2020最新版SSM框架整合教程

    2020最新版SSM框架整合教程

    这篇文章主要介绍了2020最新版SSM框架整合教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Java8合并两个Map中元素的正确姿势

    详解Java8合并两个Map中元素的正确姿势

    这篇文章主要介绍了详解Java8合并两个Map中元素的正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Mybatis 如何传入字符串参数,分割并遍历

    Mybatis 如何传入字符串参数,分割并遍历

    这篇文章主要介绍了Mybatis 如何传入字符串参数,分割并遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java设计模式UML之类图精解

    Java设计模式UML之类图精解

    在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法
    2022-02-02

最新评论