Bean 的生命周期

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8)

电脑使用的操作系统版本为 Windows 10


目录

Spring 的执行流程

1. 启动容器

2. 根据配置完成 Bean 的初始化

3. 注册 Bean 对象到容器中

4. 装配 Bean 的属性

Bean 的生命周期

Bean 的生命周期代码演示


Spring 的执行流程

在看 Bean 的生命周期之前需要先简单了解一下 Spring 的执行流程

1. 启动容器

Bean 的生命周期_第1张图片

ApplicationContext 启动容器

2. 根据配置完成 Bean 的初始化

Bean 的生命周期_第2张图片

 

加载配置文件:类加载路径下的 Beans.xml 

3. 注册 Bean 对象到容器中

Bean 的生命周期_第3张图片

Bean 的生命周期_第4张图片 

扫描 org.example 包. 扫描有没有五大类注解, 只有在包扫描的路径上的类, 且使用 Spring 的注解才可以被注册到容器中. 

4. 装配 Bean 的属性

Bean 的生命周期_第5张图片

 

如果 Bean 对象需要使用其他 Bean 对象作为属性, 可以使用注解 @Autowired 和 @Resource

Bean 的生命周期

⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。

Bean 的⽣命周期分为以下 5 ⼤部分:

1. 开辟内存空间: 实例化 ≠ 初始化

2. 设置属性 (注入属性)

3. 初始化

    3.1 各种通知

    3.2 初始化前置方法

    3.3 初始化方法(两种实现方式: xml 方式, 注解方式)

    3.4 初始化后置方法

4. 使用 Bean

5. 销毁对象

Bean 的生命周期_第6张图片

 

Bean 的生命周期代码演示

初始化方法演示

先在 com.java.demo.component 创建一个类, 叫做 BeanComponent, 然后再 spring-config.xml 里面设置 Bean

这步是初始化的通知

BeanComponent 实现接口 BeanNameAware ,就可以操作下面的 @Override 里面的内容, 比如打印 Bean的名字

package com.java.demo.component;

import org.springframework.beans.factory.BeanNameAware;

public class BeanComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知 BeanName -> " + s);
    }
}

因为初始化方法用得少.所以这步演示前置初始化方法的 xml 方式

在 spring-config.xml 里面写 init-method

可以看到他有很多方法

Bean 的生命周期_第7张图片

 Bean 的生命周期_第8张图片

 

这里只需要 init-method 

再回到 BeanComponent 写 myInit 方法, 注意名字保持一致

package com.java.demo.component;

import org.springframework.beans.factory.BeanNameAware;

import javax.annotation.PostConstruct;

public class BeanComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知 BeanName -> " + s);
    }

    // xml 方式的初始化方法
    public void myInit(){
        System.out.println("xml 方式的初始化方法");
    }

    // 注解方式的初始化方法
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("注解方式的初始化方法");
    }

    //使用 Bean
    public void sayHi(){
        System.out.println("执行 sayHi()");
    }
}

到此初始化方法全部执行完,也可以加上销毁

注解的方式执行销毁

@PreDestroy
    public void doPreDestroy(){
        System.out.println("doPreDestroy");
    }

回到 APP 里面执行

import com.java.demo.component.BeanComponent;
import com.java.demo.controller.UserController;
import com.java.demo.controller.UserController2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //不使用 ApplicationContext 而使用 ClassPathXmlApplicationContext
        //因为 ApplicationContext 没有销毁方法, 而 ClassPathXmlApplicationContext 有销毁方法
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanComponent component = context.getBean("beanComponent", BeanComponent.class);
        //使用 Bean
        component.sayHi();
        //销毁 Bean
        context.destroy();
    }
}

Bean 的生命周期_第9张图片

符合预期

注意: 注解方式的初始化方法优先级比 xml 的初始化方法优先级高,因为主流是 注解

如果,注释掉 

context.destroy();

最后的  doPreDestroy, 就不会执行


本文完,感谢观看,不足之处请在评论区指出 !

Bean 的生命周期_第10张图片

 

你可能感兴趣的:(spring)