BeanPostProcessor 接口允许在 Spring Bean Factory 返回 Bean instance 时修改 Bean 的创建过程。这是影响 Bean 生命周期的一部分。
接口有两个方法:
public interface BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}
Bean life cycle
要了解 BeanPostProcessor 接口就不得不提及 Bean 的生命周期。
Life cycle callbacks
Two groups:
- Post-initialization
 - Pre-destruction
 
Life cycle:
- Instantiation
 - Populate Properties
 - BeanNameAware’s setBeanName()
 - BeanFactoryAware’s setBeanFactory()
 - Pre-initialization BeanPostProcessors
 - InitializingBeans’ afterPropertiesSet()
 - Call custom init-method
 - Post-initialization BeanPostProcessors
 - 
    
Bean is ready to use ![[202101151422-how to become smarter]] Container is shutdown:
 - DisposableBean’s destroy()
 - Call custom destroy-method
 
Callback
Spring 提供了这些方法可以在生命周期过程中回调。
- InitializingBean 和 DisposableBean
 - Spring 提供的一系列 
*Aware接口 - 配置文件中自定义 
init()和distroy()方法 - 注解 
@PostConstruct和@PreDestroy 
InitializingBean 和 DisposableBean
大致这样:
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class DemoBean implements InitializingBean, DisposableBean
{
	//Other bean attributes and methods
	@Override
	public void afterPropertiesSet() throws Exception
	{
		//Bean initialization code
	}
	@Override
	public void destroy() throws Exception
	{
		//Bean destruction code
	}
}
Aware interfaces
- ApplicationContextAware 任何 bean 想要 ApplicationContext 启动时被通知可以实现该接口
 - ApplicationEventPublisherAware
 - BeanClassLoaderAware
 - BeanFactoryAware
 - BeanNameAware
 - BootstrapContextAware
 - LoadTimeWeaverAware
 - MessageSourceAware
 - NotificationPublisherAware
 - PortletConfigAware
 - PortletContextAware
 - ResourceLoaderAware
 - ServletConfigAware
 - ServletContextAware
 
Custom init() and destroy() methods
定义单个 Bean:
<beans>
 <bean id="demoBean" class="info.einverne.deme.DemoBean"
					init-method="customInit"
					destroy-method="customDestroy"></bean>
</beans>
全局定义:
<beans default-init-method="customInit" default-destroy-method="customDestroy">
    <bean id="demoBean" class="info.einverne.demo.DemoBean"></bean>
</beans>
@PostConstruct and @PreDestroy
- @PostConstruct annotated method will be invoked after the bean has been constructed using default constructor and just before it’s instance is returned to requesting object.
 - @PreDestroy annotated method is called just before the bean is about be destroyed inside bean container.
 
BeanPostProcessor
@Slf4j
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
	log.info("BeanPostProcessor postProcessBeforeInitialization for:" + beanName);
	return bean;
  }
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
	log.info("BeanPostProcessor postProcessAfterInitialization for:gg" + beanName);
	return bean;
  }
}