@Component
public class LifeCycleBean implements BeanNameAware, BeanFactoryAware,
ApplicationContextAware, InitializingBean {
private String value;
public LifeCycleBean() {
System.err.println("LifeCycleBean实例化");
}
@Value("${JAVA_HOME}")
public void setValue(String value) {
System.err.println("LifeCycleBean依赖注入:" + value);
this.value = value;
}
public String getValue() {
return value;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.err.println("LifeCycleBean BeanFactoryAware, beanFactory:" + beanFactory);
}
@Override
public void setBeanName(String name) {
System.err.println("LifeCycleBean BeanNameAware, beanName:" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.err.println("LifeCycleBean ApplicationContextAware, applicationContext:" + applicationContext);
}
@Override
public void afterPropertiesSet() throws Exception {
System.err.println("LifeCycleBean afterPropertiesSet");
}
@PostConstruct
public void init() {
System.err.println("LifeCycleBean PostConstruct");
}
@PreDestroy
public void destroy() {
// 容器关闭的时候才会调用
System.err.println("LifeCycleBean destroy");
}
}
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
if ("lifeCycleBean".equals(beanName)) {
System.err.println(">>>>>>> 销毁之前执行 如@PreDestroy");
}
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if ("lifeCycleBean".equals(beanName)) {
System.err.println(">>>>>>> 实例化之前执行,这里返回的bean会替换之前的bean");
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if ("lifeCycleBean".equals(beanName)) {
System.err.println(">>>>>>> 实例化之后执行,这里返回false 会跳过依赖注入阶段");
}
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if ("lifeCycleBean".equals(beanName)) {
System.err.println(">>>>>>> 依赖注入阶段执行,如@Value @Resource");
}
return pvs;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("lifeCycleBean".equals(beanName)) {
System.err.println(">>>>>>> 初始化之前执行,这里返回的对象会替换之前的bean,如@PostConstruct @ConfigurationProperties");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("lifeCycleBean".equals(beanName)) {
System.err.println(">>>>>>> 初始化之后执行,这里返回的对象会替换之前的bean 如代理增强");
// Enhancer enhancer = new Enhancer();
// enhancer.setSuperclass(bean.getClass());
// enhancer.setCallback(new InvocationHandler() {
// @Override
// public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
// System.err.println(">>>>>>> before proxy");
// Object invoke = method.invoke(bean, objects);
// System.err.println(">>>>>>> after proxy");
// return invoke;
// }
// });
// return enhancer.create();
}
return bean;
}
}
测试
// 容器销毁 bean销毁
ConfigurableApplicationContext applicationContext = SpringApplication.run(BeanTest01.class, args);
applicationContext.close();