Spring中bean的生命周期(易懂版)

简介: 关于bean的生命周期有很多的文章,但是大多数都是长篇的理论,说来说去也不是很好理解,再次我就整理了一篇比较好理解的bean的生命周期,全文通过代码的形式形象的看到bean完整的生命周期,希望对你能有帮助!

bean的生命周期


生命周期是指:从对象创建到对象的销毁的过程。


bean的生命周期分为以下五步:

(1)通过构造器创建bean实例(调用无参的构造函数)

(2)为bean的属性设置值和对其它bean引用(调用set方法)

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

(4)bean的使用(获取到对象)

(5)容器关闭,调用bean的销毁的方法(销毁方法需要进行配置)


代码演示


创建一个bean包用于演示bean的生命周期。

在bean包里创建一个Orders类演示使用。


Orders类:


package com.Keafmd.spring5.bean;
/**
 * Keafmd
 *
 * @ClassName: Orders
 * @Description: 演示bean生命周期
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 16:52
 */
public class Orders {
    private String oname;
    //无参的构造函数,为了看到调用构造函数的过程我们把这个无参的构造函数写出来
    public Orders() {
        System.out.println("第一步:执行无参构造。");
    }
  //set方法
    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步:调用set方法,设置属性值。");
    }
    //创建一个初始化的执行的方法
    public void initMethod(){
        System.out.println("第三步:执行初始化的方法。");
    }
    //创建一个销毁的执行的方法
    public void destoryMethod(){
        System.out.println("第五步:执行销毁的方法。");
    }
}

我们自己写的初始化方法和销毁方法只有配置后才会被bean识别为初始化化方法和销毁方法,在bean中这样配置:init-method="initMethod" destroy-method="destoryMethod"。


完整的bean4.xml:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!--进行配置-->
    <bean id="orders" class="com.Keafmd.spring5.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="oname" value="手机"></property>
    </bean>
</beans>

写个测试代码展示bean的生命周期。


测试类TestSpring5demo1:


package com.Keafmd.spring5.testdemo;
import com.Keafmd.spring5.bean.Orders;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Keafmd
 *
 * @ClassName: TestSpring5demo1
 * @Description: 测试类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:30
 */
public class TestSpring5demo1 {
    //演示生命周期
    @Test
    public void test4(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders",Orders.class);
        System.out.println("第四步:获取创建bean实例对象。");
        //System.out.println(orders);
        //手动让bean的实例销毁
        ((ClassPathXmlApplicationContext)context).close();
    }
}

运行结果:


第一步:执行无参构造。
第二步:调用set方法,设置属性值。
第三步:执行初始化的方法。
第四步:获取创建bean实例对象。
第五步:执行销毁的方法。
Process finished with exit code 0

这就是bean的生命周期的五个步骤,但是bean还有跟完整的生命周期,就是加上bean的后置处理器的生命周期。总共会有七步,下面进行演示。


bean的更完整的生命周期

加上bean的后置处理器后bean的生命周期就变成了七步,多出来的两步分别是在执行初始化方法前和执行初始化方法后各多出一步。


bean的更完整的生命周期分为以下七步:

(1)通过构造器创建bean实例(调用无参的构造函数)

(2)为bean的属性设置值和对其它bean引用(调用set方法)

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

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

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

(6)bean的使用(获取到对象)

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


添加后置处理器的代码演示


在上面代码的基础我们需要添加一个bean的后置处理器并且进行配置。

创建个MyBeanPost类实现BeanPostProcessor接口。


MyBeanPost:


package com.Keafmd.spring5.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;
/**
 * Keafmd
 *
 * @ClassName: MyBeanPost
 * @Description: bean的后置处理器
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 17:47
 */
public class MyBeanPost implements BeanPostProcessor {
    @Nullable
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步 Before...");
        return bean;
    }
    @Nullable
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步 After...");
        return bean;
    }
}

配置bean的后置处理器。


bean4.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="orders" class="com.Keafmd.spring5.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="oname" value="手机"></property>
    </bean>
    <!--为当前所有的bean都加上了-->
    <!--配置后置处理器-->
    <bean id="myBeanPost" class="com.Keafmd.spring5.bean.MyBeanPost"></bean>
</beans>

同样的测试代码:

测试类TestSpring5demo1:


package com.Keafmd.spring5.testdemo;
import com.Keafmd.spring5.bean.Orders;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Keafmd
 *
 * @ClassName: TestSpring5demo1
 * @Description: 测试类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:30
 */
public class TestSpring5demo1 {
    //演示生命周期
    @Test
    public void test4(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders",Orders.class);
        System.out.println("第四步:获取创建bean实例对象。");
        //System.out.println(orders);
        //手动让bean的实例销毁
        ((ClassPathXmlApplicationContext)context).close();
    }
}

运行结果:


第一步:执行无参构造。
第二步:调用set方法,设置属性值。
第三步 Before...
第三步:执行初始化的方法。
第三步 After...
第四步:获取创建bean实例对象。
第五步:执行销毁的方法。
Process finished with exit code 0

以上就是关于bean生命周期的全部代码展示。


相关文章
|
10天前
|
XML 安全 Java
|
1月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
8天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
16 1
|
2月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
75 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
3月前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
278 24
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
3月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
239 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
3月前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
2月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
120 1
|
2月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
46 1