BeanFactoryPostProcessor是什么?
BeanFactoryPostProcessor是Bean工厂后置处理器,它是Spring的一个扩展点,可以让我们在Spring初始化Bean之前修改BeanDefinition或者注册BeanDefinition。接口定义如下:
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
调用时机
在之前的文章Spring系列-Bean创建流程中我们已经讲过了,会在refresh()方法中的this.invokeBeanFactoryPostProcessors()方法中调用所有BeanFactoryPostProcessor的postProcessBeanFactory()方法。
自定义BeanFactoryPostProcessor
修改BeanDefinition
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 这里可以获取到已存在的BeanDefinition,并进行修改
BeanDefinition bd = beanFactory.getBeanDefinition("test");
bd.setPrimary(true);
bd.setDescription("By BeanFactoryProcessor");
}
}
注册BeanDefinition
注册这里需要注意的是,beanFactory实例必须是BeanDefinitionRegistry类型的才可以进行注册BeanDefinition。
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.demo.Test");
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
beanDefinition.setAutowireCandidate(true);
((BeanDefinitionRegistry) beanDefinition).registerBeanDefinition("test", beanDefinition);
}
}
BeanDefinitionRegistryPostProcessor是什么?
BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,增加在专门用于注册BeanDefinition的生命周期回调接口,可以更方便的进行注册。它其实实际上和上面讲的使用BeanFactoryPostProcessor进行注册BeanDefinition没什么区别,其其作用的前提也是必须BeanFactory的实例是BeanDefinitionRegistry类型。接口定义如下:
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
调用时机
同BeanFactoryPostProcessor,只不过postProcessBeanDefinitionRegistry()方法的调用在postProcessBeanFactory()之前。
自定义BeanDefinitionRegistryPostProcessor
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
// 通过该方法注册BeanDefinition更加方便,不用再强转BeanDefinitionRegistry类型了
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName("com.demo.Test");
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
beanDefinition.setAutowireCandidate(true);
registry.registerBeanDefinition("test", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
用途
用于其它框架与Spring框架集成。
例如:mybatis与Spring集成时,Mapper接口的BeanDefinition的注册是通过MapperScannerConfigurer实现的,而MapperScannerConfigurer是实现了BeanDefinitionRegistryPostProcessor接口,在postProcessBeanDefinitionRegistry()方法中实现了Mapper接口的扫描,并进行了BeanDefinition的注册。