后置处理器BeanPostProcessor

BeanPostProcessor:回调机制,在 bean 的初始化前后做一些额外的处理,扩展功能。
可以配置多个 BeanPostProcessor 实例,并且可以通过实现Ordered接口,设置order属性来控制这些BeanPostProcessor实例的运行顺序。

//原接口
public interface BeanPostProcessor {
    
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

//编写后置处理器,对每个bean的创建都会生效
@Component
public class AnimalBeanPostProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的初始化之前:" + beanName);
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("拦截到Bean的初始化之后:" + beanName);
        return bean;
    }
}

通过后置处理器修改bean的属性

@Component
public class CatBeanPostProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Cat) {
            Cat cat = (Cat) bean;
            System.out.println("初始化之前,cat的name为:" + cat.getName());
            cat.setName("zhangsan");
        }
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Cat) {
            Cat cat = (Cat) bean;
            System.out.println("初始化之后,cat的name为:" + cat.getName());
        }
        return bean;
    }
}

bean的初始化流程:

对于factorybean,后置处理器会在factorybean创建时执行Before和after方法,在用factorybean去getbean时,执行after方法。

BeanPostProcessor的扩展接口:

InstantiationAwareBeanPostProcessor:

default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    return null;
}

default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
}

default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
        throws BeansException {
    return null;
}

DestructionAwareBeanPostProcessor:

void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

default boolean requiresDestruction(Object bean) {
    return true;
}

@Component
public class DestructionPenPostProcessor implements DestructionAwareBeanPostProcessor {
    
    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        if (bean instanceof Pen) {
            System.out.println("DestructionPenPostProcessor postProcessBeforeDestruction run ......");
            Pen pen = (Pen) bean;
            pen.setInk(0);
        }
    }
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------BeanFactoryPostProcessor:BeanFactoryPostProcessor 的作用是在 BeanDefinition 已经注册到 BeanFactory 后,对 BeanDefinition 进行修改 / 配置,其本身也是一个bean。

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    Stream.of(beanFactory.getBeanDefinitionNames()).forEach(beanName -> {
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
        if (StringUtils.hasText(beanDefinition.getBeanClassName())) {
            if (ClassUtils.resolveClassName(beanDefinition.getBeanClassName(), this.getClass().getClassLoader())
                .getSuperclass().equals(Color.class)) {
                beanDefinition.getPropertyValues().add("name", beanName);
            }
        }
    });
}

BeanDefinitionRegistryPostProcessor:BeanDefinitionRegistryPostProcessor 的执行时机比 BeanFactoryPostProcessor 更早,BeanFactoryPostProcessor 一般只用来修改、扩展 BeanDefinition 中的信息,而 BeanDefinitionRegistryPostProcessor 则可以在 BeanFactoryPostProcessor 处理 BeanDefinition 之前,向 BeanFactory 注册新的 BeanDefinition ,甚至注册新的 BeanFactoryPostProcessor 用于下一个阶段的回调。

@Component
public class DogRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        if (!registry.containsBeanDefinition("dog")) {
            // 构造BeanDefinition,并注册进BeanFactory
            BeanDefinition dogDefinition = BeanDefinitionBuilder.genericBeanDefinition(Dog.class).getBeanDefinition();
            registry.registerBeanDefinition("dog", dogDefinition);
        }
    }
    
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}
posted @ 2022-10-05 19:09  无极是一种信仰  阅读(65)  评论(0)    收藏  举报