邢台物流网站建设,网站建设 会议纪要,wordpress 不同域名,e龙岩官网登录此注解是springboot自动注入的关键注解#xff0c;所以拿出来单独分析一下。
启动类的run方法跟进去最终找到refresh方法#xff1b;
这里直接看这个org.springframework.context.support.AbstractApplicationContext#refresh方法即可#xff0c;它下面有一个方法
invoke…此注解是springboot自动注入的关键注解所以拿出来单独分析一下。
启动类的run方法跟进去最终找到refresh方法
这里直接看这个org.springframework.context.support.AbstractApplicationContext#refresh方法即可它下面有一个方法
invokeBeanFactoryPostProcessors(beanFactory)
此处 最终调用的是
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法
在这里就不做详细的每一步分析了直接找起作用的代码了。
它下面有一段如下代码
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
String[] postProcessorNames beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);断点可以看到 在加上代码的注释此时第一步调用了获取实现BeanDefinitionRegistryPostProcessor的接口的类的方法可以看到此时只有一个类即ConfigurationClassPostProcessor类它是由容器初始化的时候指定加载的bean定义用来扫描springboot注解配置的相关属性类
所以此时就会调用其的processConfigBeanDefinitions方法此方法中有一个
parser.parse(candidates)
最终调用的方法中会有如下代码
// Process any Import annotations
processImports(configClass, sourceClass, getImports(sourceClass), filter, true)
可以看到到此处的时候才会去加载Import注解但在此之前程序会扫描Component、PropertySourcesComponentScans注解
此时读取到相应的实现import引入的类的selectImports方法即可执行相关的配置属性在执行的时候有一个判断
if (candidate.isAssignable(ImportSelector.class)) {
}else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {
}
即使用Import注解时其类必须实现ImportSelector接口或者ImportBeanDefinitionRegistrar接口
然后调用其selectImports方法或者registerBeanDefinitions方法这里ImportSelector还有一个子接口即DeferredImportSelector接口
那么在这个三者之间存在什么关系
if (selector instanceof DeferredImportSelector) {
this.deferredImportSelectorHandler.handle(configClass, (DeferredImportSelector) selector);
}
如果实现了DeferredImportSelector接口它会将其放入一个DeferredImportSelectorHandler中不会立马执行而如果是ImportSelector接口则会直接调用其方法。如果是ImportBeanDefinitionRegistrar接口则会添加到ConfigurationClass#importBeanDefinitionRegistrars属性中他是一个map。
所以ImportSelector接口会直接执行方法其他两种都会延迟执行加载那么延迟到什么时候呢
1对于DeferredImportSelector接口则是parse方法的最后一步
this.deferredImportSelectorHandler.process()
此时才会去执行实现ImportBeanDefinitionRegistrar接口的方法
此时要注意ImportBeanDefinitionRegistrar接口内部有一个Group接口当getImportGroup方法不返回null时此时就不会执行其selectImports接口了此时会调用Group下的process方法此处在后面会使用到 ImportSelector与DeferredImportSelector的区别就是selectImports方法执行时机有差别在DeferredImportSelector之前会对ImportResource、Bean这些注解进行处理。
2对于ImportBeanDefinitionRegistrar接口
在上面的parse方法执行完之后会有如下方法
this.reader.loadBeanDefinitions(configClasses)
此时会执行ImportBeanDefinitionRegistrar接口的方法
所以最终的执行时机为
ImportSelector接口的优先级高于DeferredImportSelector接口的执行时机
DeferredImportSelector接口的优先级高于ImportBeanDefinitionRegistrar接口的执行时机。