👨🏫 参考视频地址
💖 五步版
- 实例化 bean(构造方法)
- 属性注入(
set()
方法) - 初始化方法(自定义)
- 使用bean
- 销毁方法(自定义)
💖 七步版
- 实例化 bean(构造方法)
- 属性注入(
set()
方法) - bean后置处理器的前置方法执行…(
postProcessBeforeInitialization()
) - 初始化方法(自定义)
- bean后置处理器的后置方法执行…(
postProcessAfterInitialization()
) - 使用bean
- 销毁方法(自定义)
💖 十步版
-
实例化 bean(构造方法)
- 在AbstractAutowireCapableBeanFactory类中的
createBeanInstance
方法中实现
- 在AbstractAutowireCapableBeanFactory类中的
-
属性注入(
set()
方法)- 在 AbstractAutowireCapableBeanFactory 的
populateBean
方法中处理
- 在 AbstractAutowireCapableBeanFactory 的
-
Aware接口
- 在AbstractAutowireCapableBeanFactory的
initializeBean
方法中调用
- 在AbstractAutowireCapableBeanFactory的
-
bean后置处理器的前置方法执行…(
postProcessBeforeInitialization()
)- 由AbstractAutowireCapableBeanFactory的
applyBeanPostProcessorsBeforeInitialization
方法执行。
- 由AbstractAutowireCapableBeanFactory的
-
InitializingBean接口(
afterPropertiesSet()
)- 提供一个机会,在所有Bean属性设置完成后进行初始化操作
- 在AbstractAutowireCapableBeanFactory的
invokeInitMethods
方法中调用。
-
初始化方法(自定义)
- 在AbstractAutowireCapableBeanFactory的
invokeInitMethods
方法中调用。
- 在AbstractAutowireCapableBeanFactory的
-
bean后置处理器的后置方法执行…(
postProcessAfterInitialization()
)- 注册Destruction回调:如果Bean实现了DisposableBean接口或在Bean定义中指定了自定义的销毁方法,Spring容器会为这些Bean注册一个销毁回调,确保在容器关闭时能够正确地清理资源。
- 由AbstractAutowireCapableBeanFactory的
applyBeanPostProcessorsAfterInitialization
方法执行
-
使用bean
-
DisposableBean接口(销毁前调用方法
destroy()
)- 当容器关闭时,如果Bean实现了DisposableBean接口,destroy方法会被调用。
- 在DisposableBeanAdapter的
destroy
方法中实现
-
销毁方法(自定义)
- 在DisposableBeanAdapter的
destroy
方法中实现
- 在DisposableBeanAdapter的
整个 Bean 的创建过程都依赖于 AbstractAutowireCapatableBeanFactory 这个类,而销毁Bean主要依赖 DisposableBeanAdapter 这个类。
🌟 测试代码
⭐ User
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @author : lighting
*/
public class User implements BeanFactoryAware, InitializingBean, DisposableBean {
String name;
public User() {
System.out.println("1. 实例化 bean");
}
public User(String name) {
this.name = name;
}
public void setName(String name) {
System.out.println("2. 属性注入");
this.name = name;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println(" ③ Aware接口");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println(" ⑤ InitializingBean接口");
}
void myInit(){
System.out.println("7. 初始化方法");
}
public String getName() {
System.out.println("8. 使用bean");
return name;
}
@Override
public void destroy() throws Exception {
System.out.println(" ⑨ DisposableBean接口");
}
void myDestroy(){
System.out.println("10. 销毁方法");
}
}
class MyProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if("user".equals(beanName))
System.out.println(" 4) bean后置处理器的前置方法执行...");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if("user".equals(beanName))
System.out.println(" 6) bean后置处理器的后置方法执行...");
return bean;
}
}
⭐ spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
">
<bean id="user" class="com.lighting.bean.User"
init-method="myInit"
destroy-method="myDestroy">
<property name="name" value="李白"></property>
</bean>
<bean id="processor" class="com.lighting.bean.MyProcessor">
</bean>
</beans>