今天看到有人在问SpringBoot自动装配原理。

很多人讲这个会从@EnableAutoConfiguration注解为入口其实对于初学者来说还是不太容易理解,为什么有这个注解就会自动装配了
其实SpringBoot的入口在invokeBeanFactoryPostProcessors(beanFactory);这个方法中,熟悉Spring源码的应该知道,这个类会加载执行我们的所有BeanFactoryPostProcessor,而这个方法中SpringBoot做了扩展,就是获取BeanFactory中的所有BeanDefinitionRegistryPostProcessor.class,结果只有一个就是org.springframework.context.annotation.internalConfigurationAnnotationProcessor,这个类并不是我们的目标类,也很明显这个类的首个字母为小写,但是这个类指向的是我们ConfigurationClassPostProcessor,具体为什么感兴趣的可以查一下,我就不展开了,这个类是SpringBoot的核心类,他会扫描SpringBoot启动器类加载器所能触及的所有加有@Bean,@Component等,对于自动装配我们只关注他会递归扫描我们启动器类上的注解,将所有@Import注解标注的目标类,加入到this.deferredImportSelectors属性中,然后根据注解的目标类也就是我们的AutoConfigurationImportSelector.class,然后遍历所有的引入的类的getImports()方法,我们只关注AutoConfigurationImportSelector的,方法中有一个重要的方法getAutoConfigurationEntry(annotationMetadata);进入方法中我们只需要关注List configurations = getCandidateConfigurations(annotationMetadata, attributes);这一行,进去后发现了我们最熟悉的SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());而第一个参数(getSpringFactoriesLoaderFactoryClass()返回的就是EnableAutoConfiguration.class;
OK收,此时我们获取自动装配类的逻辑已经结束了,对于后续有兴趣的可以自己翻几遍源码。谢谢大家。

上一篇:Redis的两种JSON的序列化器 GenericToStringSerializer和Jackson2JsonRedisSerializer


下一篇:Redis学习第三天