BeanDefinitionRegistryPostProcessor介绍
在开始之前我们要介绍一下 BeanDefinitionRegistryPostProcessor接口
BeanDefinitionRegistryPostProcessor 接口可以看作是BeanFactoryPostProcessor和ImportBeanDefinitionRegistrar的功能集合
BeanDefinitionRegistryPostProcessor 这个接口的调用分为三步:
1、调用实现了 PriorityOrdered 排序接口
2、调用实现了 Ordered 排序接口
3、没有实现接口的调用
这个接口我们可以理解:
获取BeanDefinitionRegistry对象,获取到这个对象就可以获取这个对象中注册的所有BeanDefintion对象,所以我们知道,我们拥有这个对象就可以完整里面所有BeanDefiniton对象的修改、新增的操作。
使用如下:
@Componentpublic class YjBeanDefinationRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { System.out.println("YjBeanDefinationRegisterPostProcessor的postProcessBeanDefinitionRegistry方法"); //框架自己的 BeanDefiniton Count System.out.println("bean定义的数据量:"+registry.getBeanDefinitionCount()); RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TulingLog.class); registry.registerBeanDefinition("yjLog",rootBeanDefinition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("YjBeanDefinationRegisterPostProcessor的postProcessBeanFactory方法"); System.out.println(beanFactory.getBeanDefinitionCount()); }}
那么此接口在Spring源码里什么时候执行的呢?
实现自定义注解
1、定义MyService注解
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface MyService { @AliasFor(annotation = Component.class) String value( ) default "";}
2、实现BeanDefinitionRegistryPostProcessor接口,实现自定义注解的扫描和加载
public class MyBeanDefintionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{ @Override public void postProcessBeanDefinitionRegistry( BeanDefinitionRegistry registry ) throws BeansException { String[] beanDefintionNames = registry.getBeanDefinitionNames(); for(String beanDefinitonName : beanDefintionNames){ BeanDefinition beanDefinition = registry.getBeanDefinition(beanDefinitonName); System.out.println(beanDefinition.getAttribute("key")); } //定义一个扫描器 ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry); scanner.addIncludeFilter(new AnnotationTypeFilter(MyService.class)); scanner.scan("com.wy.anno"); } @Override public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory ) throws BeansException { }}
3、定义service类
@MyServicepublic class UserService{}
4、测试
public void test4() { AnnotationConfigApplicationContext appcationContext = new AnnotationConfigApplicationContext("com.wy.anno"); UserService userService = (UserService)appcationContext.getBean("userService"); System.out.println(userService); }
结果: