拦截Bean使用之前各个时机的Spring组件
- 之前使用过的
BeanPostProcessor
就是在Bean实例化之后,注入属性值之前的时机。
Spring Bean的生命周期 - 本次演示的是在Bean实例化之前的时机,使用
BeanFactoryPostProcessor
进行验证,以及在加载Bean之前进行拦截的,BeanDefinitionRegistryProcessor
。
Bean被使用前的时机
声明、解析、实例化、注入属性值
解析Bean前——BeanDefinitionRegistryPostProcessor
/*** 在解析Bean之前对容器的信息进行拦截*/
@Component
public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {/*** 执行加载Bean之前*/@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 可以手动的给容器注册BeanBeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Banana.class);AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();registry.registerBeanDefinition("myOrange", beanDefinition);}/*** 执行加载Bean之后*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("BeanDefinitionRegistryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));}
}
实例化Bean前——BeanFactoryPostProcessor
/*** 在给每一个Bean实例化之前,获取该容器*/
@Component
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic 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();// 测试BeanDefinitionRegistryPostProcessorconfigContext.register(BeanConfiguration.class);configContext.refresh();System.out.println("configContext: " + configContext.getBean("myOrange", Banana.class));}
配置类
@Configuration
@Import({TestBeanDefinitionRegistryPostProcessor.class, TestBeanFactoryPostProcessor.class })
public class BeanConfiguration {
}