观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8)
电脑使用的操作系统版本为 Windows 10
目录
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, 就不会执行
本文完,感谢观看,不足之处请在评论区指出 !