Spring IOC(4)BeanFactoryPostProcessor(1)

X类,Y类(被注解)通过class Loader编译成X.class,Y.class文件;
this.invokeBeanFactoryPostProcessors(beanFactory);{
1、通过ConfigurationClassPostProcessor扫描成beanDefinition对象,
2、我们可以通过BeanFactoryPostProcessor把X类也变成beanDefinition,(程序员提供了就执行,不提供就不执行);
3、再放到beanDefinitionMap中}
在这个方法中,会先执行spring自己的处理器处理那些被注解的类,我们程序员可以通过自己的操作实现BeanFactoryPostProcessor(继承这个接口,再实现也是可以的),把X类通过其中的方法,把X类放到
beanDefinitionMap中,也可以在这里修改已经注解的类;

为什么先实现spring内部PostProcessor;
在spring中做了这个判断,当我们的处理器是BeanDefinitionRegistryPostProcessor的时候就先执行,BeanDefinitionRegistryPostProcessor是属于spring内部的处理器,他与提供给我们程序员的额处理器分开了;
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor)//当处理器继承BeanDefinitionRegistryPostProcessor时,优先执行
spring也有开放给我们可以修改spring内部的处理器;
BeanDefinitionRegistryPostProcessor一般不会被使用,没什么案例会使用这个接口,这个接口太顶级了,他在我们还未完成扫描的时候就执行了;使用性不高;

this.reader = new AnnotatedBeanDefinitionReader(this);为配置类特别设计的,把配置类变成BeanDefinition;其他的类由他来扫描;

spring的扫描机制
applicationContext.scan(“two.first”);–>(子方法)
doScan方法中的
1、Set candidates = this.findCandidateComponents(basePackage);方法中的方法–>(子方法)
2、 String packageSearchPath = “classpath*:” + this.resolveBasePackage(basePackage) + ‘/’ + this.resourcePattern;
//拿到路径
3、Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);
遍历resources
4、MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);
查到metadataReader类,包含文件的元数据,也包含了所有的注解信息;
5、this.isCandidateComponent(metadataReader)–>(子方法)
判断我们的当前类是否符合规则,比如包含@Component注解
6、在上面方法中有个重要的判断 for(TypeFilter tf : this.includeFilters),只有把类加入了TypeFilter中才会被允许加入ScannedGenericBeanDefinition中,才能在后面add方法中加入到BeanDefinitionMap中去;在spring内部只有@Component才被允许加入到TypeFilter中;但是我们可以重写其中的add方法以达到我们自己扫描类的要求;
自定义扫描类
重写addIncludeFilter方法;我们创建一个类继承自ClassPathBeanDefinitionScanner,ClassPathBeanDefinitionScanner继承自ClassPathScanningCandidateComponentProvider方法,我们继承ClassPathBeanDefinitionScanner就也有资格重写addIncludeFilter方法,通过重写,把自己的类加入TypeFilter中;
继承类:
public class CustomScanner extends ClassPathBeanDefinitionScanner {
public CustomScanner(BeanDefinitionRegistry registry){
super(registry);
}
}


自定义扫描类
@Retention(RetentionPolicy.RUNTIME)
public @interface TestConfig {
}
被扫描类


@TestConfig
public class testTwo {
}


测试类:
AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(JavaConfig.class);
CustomScanner customScanner=new CustomScanner(applicationContext);
customScanner.addIncludeFilter(new AnnotationTypeFilter(TestConfig.class));
//重写addIncludeFilter方法;
int scan=customScanner.scan(“sum”);
System.out.println(scan);//打印出1表示我们重写成功了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值