从SpringBoot源码分析 主程序配置类加载过程
1、@Import(AutoConfigurationPackages.Registrar.class)
初始SpringBoot 我们知道在SpringBoot 启动类上有一个@SpringBootApplication注解,配置类的加载就是从这里开始(源头),一起走起。
@SpringBootApplication是一个复合注解,其中包括Java元注解(@Target,@Retention,@Documented,@Inherited),不清楚注解的小伙伴可以参考Java注解,其实就这么简单这篇博客学习
@ComponentScan 包扫描组件
@EnableAutoConfiguration,告诉SpringBoot开启自动配置功能,我们之前需要配置的东西,现在都不需要了,SpringBoot 都帮我们做了。
接下来我们主要将一下@EnableAutoConfiguration这个注解中@AutoConfigurationPackage是自动配置包
在@AutoConfigurationPackage包里有@Import(AutoConfigurationPackages.Registrar.class)的注解,@Import是Spring的底层注解,表示给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class决定。
在AutoConfigurationPackages下面的registerBeanDefinitions 方法,获取主配置类下所有包及子包的组件导入到Spring 容器当中。
重点@Import(AutoConfigurationPackages.Registrar.class)
上面分析了那么多,可能有的小伙伴们不知道我在干嘛?,其实整个过程主要是实现是将主配置类(@SpringBootApplication)标注的所有包及子包里面的所有组件扫描到Spring容器当中。
也许有初始SpringBoot 的小伙伴们会遇到这样的问题,就是项目启动了,访问页面回出现404,那我下面举例说明一下,你可能就明白了。
细节说明:比如我定义一个UserController类, 但是这个类不在SpringBoot 的主配置的目录下面
项目结构图及实现类
@RestController public class UserController { @RequestMapping("/helloTest") public String helloTest(){ return "hello"; } }
页面访问:页面显示404
所以综合我们前面提到了,在使用SpringBoot 开发项目的时候,创建类的时候需要在(@SpringBootApplication)标注的所有包及子包里面创建,这样是SpringBoot 就能把所有的组件加入到Spring容器当中。
2、@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector类,跟踪代码:
从源码中可以看出SpringBoot 在启动的时候从类路径下的 META-INF/spring.factores 中获取EnableAutoConfiguration指定的值,将这些作为自动配置类导入到容器当中,自动配置类就生效,帮我们进行自动配置的工作。
关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件.
3、小结
(1)、 @Import(AutoConfigurationPackages.Registrar.class),实现是将主配置类(@SpringBootApplication)标注的所有包及子包里面的所有组件扫描到Spring容器当中。
(2)、 @Import(AutoConfigurationImportSelector.class),实现的是SpringBoot 在启动的时候从类路径下的 META-INF/spring.factores 中获取EnableAutoConfiguration指定的值,将这些作为自动配置类导入到容器当中,自动配置类就生效,帮我们进行自动配置的工作。
由于本人能力有限,若文章有错误的地方,请大家指出,一起交流学习。今天就和大家讲到这里,喜欢我的小伙伴们,动动你的小手点个关注呗。
欢迎大家关注我的公众号:阿福聊编程,长期更新Java各种技术文章。
?