拦截Bean使用之前各个时机的Spring组件
- 之前使用过的
BeanPostProcessor
就是在Bean实例化之后,注入属性值之前的时机。
Spring Bean的生命周期 - 本次演示的是在Bean实例化之前的时机,使用
BeanFactoryPostProcessor
进行验证,以及在加载Bean之前进行拦截的,BeanDefinitionRegistryProcessor
。
Bean被使用前的时机
声明、解析、实例化、注入属性值
解析Bean前——BeanDefinitionRegistryPostProcessor
/**
* 在解析Bean之前对容器的信息进行拦截
*/
@Component
public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
/**
* 执行加载Bean之前
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 可以手动的给容器注册Bean
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Banana.class);
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
registry.registerBeanDefinition("myOrange", beanDefinition);
}
/**
* 执行加载Bean之后
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("BeanDefinitionRegistryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));
}
}
实例化Bean前——BeanFactoryPostProcessor
/**
* 在给每一个Bean实例化之前,获取该容器
*/
@Component
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 根据name 获取相应的Bean对象
// BeanDefinition beanDefinition = beanFactory.getBeanDefinition("");
// 获取容器中bean的个数
// int beanDefinitionCount = beanFactory.getBeanDefinitionCount();
// System.out.println("beanDefinitionCount:" + beanDefinitionCount);
// 获取已经实例化的Bean
// String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
// for (String beanDefinitionName : beanDefinitionNames) {
// System.out.println(beanDefinitionName);
// }
// 获取当前时机之前使用过的拦截器
// BeanFactory parentBeanFactory = beanFactory.getParentBeanFactory();
// System.out.println("BeanFactoryPostProcessor ParentFactory: " + parentBeanFactory);
System.out.println("BeanFactoryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));
}
}
测试代码
public static void configContext() {
AnnotationConfigApplicationContext configContext = new AnnotationConfigApplicationContext();
// 测试BeanDefinitionRegistryPostProcessor
configContext.register(BeanConfiguration.class);
configContext.refresh();
System.out.println("configContext: " + configContext.getBean("myOrange", Banana.class));
}
配置类
@Configuration
@Import({TestBeanDefinitionRegistryPostProcessor.class, TestBeanFactoryPostProcessor.class })
public class BeanConfiguration {
}