Bean 的生命周期

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

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


目录

Spring 的执行流程

1. 启动容器

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

3. 注册 Bean 对象到容器中

4. 装配 Bean 的属性

Bean 的生命周期

Bean 的生命周期代码演示


Spring 的执行流程

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

1. 启动容器

ApplicationContext 启动容器

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

 

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

3. 注册 Bean 对象到容器中

 

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

4. 装配 Bean 的属性

 

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

Bean 的生命周期

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

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

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

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

3. 初始化

    3.1 各种通知

    3.2 初始化前置方法

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

    3.4 初始化后置方法

4. 使用 Bean

5. 销毁对象

 

Bean 的生命周期代码演示

初始化方法演示

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

<bean id="beanComponent" class="com.java.demo.component.BeanComponent" ></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

可以看到他有很多方法

 

 

这里只需要 init-method 

<bean id="beanComponent" class="com.java.demo.component.BeanComponent" init-method="myInit"></bean>

再回到 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();
    }
}

符合预期

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

如果,注释掉 

context.destroy();

最后的  doPreDestroy, 就不会执行


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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值