每个SpringBoot项目的启动类都有一个@SpringBootApplication这个注解,但它到底是什么呢?
1、根据Spring的官方文档介绍,@SpringBootApplication等同于三个注解
2、@SpringBootApplication点进去,删除元注解之后等同于:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
3、@SpringBootConfiguration点进去,删除元注解之后等同于:
@Configuration
至此,证明了官方说的@SpringBootApplication等同于:@Configuration、@EnableAutoConfiguration、@ComponentScan
这些注解的作用是什么?继续分析这三个注解
1、@Configuration
点进去,删除元注解之后等同于:@Component
查Spring官方文档发现@Repository、@Service、@Controller都包含了@Component的注解,一旦被该注解修饰的,都会交给Spring IOC容器管理
那么它的作用应该就是bean管理或者导入配置
官方的说法:allow to register extra beans in the context or import additional configuration classes
2、@ComponentScan
点进去之后发现有我们熟悉的配置参数[basePackages]
它的作用:扫描用户自定义的包中的类,把这些声明特定注解的类交给ICO管理
官方的说法:scan on the package where the application is located
3、@EnableAutoConfiguration
点击进去,删除元注解之后等同于:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) 导入springboot项目启动所需要的默认类
那它是怎么兼容第三方包的呢?
打开AutoConfigurationImportSelector,在process方法打断点看一下,发现在方法getAutoConfigurationEntry的configurations加载了很多类的全路径
那它是从哪儿加载进来的呢,咱们再点进 getCandidateConfigurations 方法瞧一瞧
看到了一行断言:
No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
似乎有点眉目了,据此推测应该是在auto configuration 的META-INF/spring.factories下面,找找看
果然在这儿,至此,对SpringBoot的自动装配似乎多了几分了解,但是可以看到,加进来的配置和配置文件的不是完全一样,因为还有@Conditional条件判断,比如那些配置了全路径却没有导包进来的,就会被过滤掉,不会进行实例化。
bean注入的条件判断也是个模块,今天先看到这儿,后续再进一步深入。
项目基于SpringBoot2.1.6