一、什么是Bean后置处理器
理论:Spring Bean后处理器是Spring框架提供的一种扩展机制,划重点:扩展机制。用于再Spring容器实例化、配置和初始化Bean的过程中,添加自定义逻辑。(大白话:后处理器是可以在Bean的生命周期的不同阶段 进行干预,可以对Bean进行修改、增强或者执行其他操作。开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例化的一个过程)
二、顶层核心BeanPostProcessor 接口定义
BeanPostProcessor的接口定义如下:
public interface BeanPostProcessor {
@Nullable
//在属性注入完毕,init初始化方法执行之前被回调
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeanException {
return bean;
}
@Nullable
//在初始化方法执行之后,被添加到单例池singletonObjects之前被回调
default Object PostProcessAfterInitialization(Object bean, String beanName) throws BeanException {
return bean;
}
}
三、实现案例
以下是自定义个一个Bean后处理器 实现了BeanPostProcessor
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("<<<<<< 实例化之前执行, 这里返回的对象会替换掉原本的 bean");
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("<<<<<< 实例化之后执行, 这里如果返回 false 会跳过依赖注入阶段");
// return false;
}
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("<<<<<< 依赖注入阶段执行, 如 @Autowired、@Value、@Resource");
}
return pvs;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("<<<<<< 初始化之前执行, 这里返回的对象会替换掉原本的 bean, 如 @PostConstruct、@ConfigurationProperties");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("<<<<<< 初始化之后执行, 这里返回的对象会替换掉原本的 bean, 如代理增强");
}
return bean;
}
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("<<<<<< 销毁之前执行, 如 @PreDestroy");
}
}
}
如上代码,实现了两个后处理器:InstantiationAwareBeanPostProcessor 和 DestructionAwareBeanPostProcessor ,如下图,这俩后处理器都是实现了BeanPostPocessor。
if (beanName.equals(“lifeCycleBean”)) 是为了筛选出bean name为 lifeCycleBean 从而测试我们的自定义后置处理器,请认真仔细看打印的内容。
以下是LifeCycleBean 的代码
@Component
public class LifeCycleBean {
public LifeCycleBean() {
System.out.println("构造");
}
@Autowired
public void autowire(@Value("${JAVA_HOME}") String home) {
System.out.println("依赖注入: " + home);
}
@PostConstruct
public void init() {
System.out.println("初始化");
}
@PreDestroy
public void destroy() {
System.out.println("销毁");
}
}
启动程序代码
@SpringBootApplication
public class SpringgggApplication {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(SpringgggApplication.class, args);
context.close();
}
}
如上代码,context.close(); 是为了销毁bean 从而形成一个bean的完整生命周期。
其打印结果如下,我们已经达到了增强的目的,也就是如开头所讲:开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例化的一个过程