Spring生命周期
BeanDefinition:
生命周期流程
-
通过BeanDefinition获取bean的定义信息
-
通过构造函数实例化bean
-
bean的依赖注入
-
处理Aware接口(BeanNameAware,BeanFactoryAware,ApplicationContextAware)
-
Bean的后置处理器BeanPostProcessor-前置
-
初始化方法(initializingBean、init-method)
-
Bean的后置处理器BeanPostProcessor-后置
-
销毁bean
具体样例:
Bean类
public class BeanLife implements BeanNameAware, ApplicationContextAware, BeanFactoryAware, InitializingBean {
public BeanLife(){
System.out.println("构造方法执行");
}
private String name;
@Value("张三")
public void setName(String name){
System.out.println("setName方法执行了");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("setBeanFactory方法执行了");
}
@Override
public void setBeanName(String s) {
System.out.println("setBeanName方法执行了");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("setApplicationContext方法执行了");
}
/**
* initializingBean接口
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet方法执行了");
}
@PostConstruct
public void init(){
System.out.println("自定义init方法");
}
@PreDestroy
public void preDestroy(){
System.out.println("销毁前执行:PreDestroy方法执行");
}
}
后置处理器类:CGLIB生成代理对象
package com.example.demo.LifeCycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;
/**
* @fileName: BeanPostProcessorT
* @author: 四面神
* @createTime:2023/11/26 17:33
* 描述:
*/
public class BeanPostProcessorT implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("对象初始化前置开始加强");
return null;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("对象初始化后置加强");
//CGLIB代理对象
Enhancer enhancer = new Enhancer();
//设置需要增强的类
enhancer.setSuperclass(bean.getClass());
enhancer.setCallback(new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
return method.invoke(method,objects);
}
});
return enhancer.create();
}
}