观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8)
电脑使用的操作系统版本为 Windows 10
目录
Spring 的执行流程
1. 启动容器
2. 根据配置完成 Bean 的初始化
3. 注册 Bean 对象到容器中
4. 装配 Bean 的属性
Bean 的生命周期
Bean 的生命周期代码演示
在看 Bean 的生命周期之前需要先简单了解一下 Spring 的执行流程
ApplicationContext 启动容器
加载配置文件:类加载路径下的 Beans.xml
扫描 org.example 包. 扫描有没有五大类注解, 只有在包扫描的路径上的类, 且使用 Spring 的注解才可以被注册到容器中.
如果 Bean 对象需要使用其他 Bean 对象作为属性, 可以使用注解 @Autowired 和 @Resource
⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。
Bean 的⽣命周期分为以下 5 ⼤部分:
1. 开辟内存空间: 实例化 ≠ 初始化
2. 设置属性 (注入属性)
3. 初始化
3.1 各种通知
3.2 初始化前置方法
3.3 初始化方法(两种实现方式: xml 方式, 注解方式)
3.4 初始化后置方法
4. 使用 Bean
5. 销毁对象
初始化方法演示
先在 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
可以看到他有很多方法
这里只需要 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();
}
}
符合预期
注意: 注解方式的初始化方法优先级比 xml 的初始化方法优先级高,因为主流是 注解
如果,注释掉
context.destroy();
最后的 doPreDestroy, 就不会执行
本文完,感谢观看,不足之处请在评论区指出 !