目录
关于@Import(AutoConfigurationImportSelector.class)
注解内部代码
该注解中包含比较重要的两块:@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)
关于@AutoConfigurationPackage
首先@EnableAutoConfiguration中包含@AutoConfigurationPackage注解,其作用就是将其所在类的包及其子包扫入spring容器中
比如我们按照传统的方法要写一个控制器在包 com.test.learn.controller下,如果用传统的写法,需要把com.test.learn.controller手写到scan扫描器里从而加入spring容器。
对比spring boot自动配置:
package com.test.learn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LearnApplication {
public static void main(String[] args) {
SpringApplication.run(LearnApplication.class, args);
}
}
@AutoConfigurationPackage:使spring boot自动配置 => 例如@SpringBootApplication包含@AutoConfigurationPackage,它可以找到@SpringBootApplication所在类的包,按照上面代码的例子该包就是com.test.learn,所以它会将该包com.test.learn和所有子包com.test.learn.xxx扫入spring容器中。
所以比较明了了,@AutoConfigurationPackage就是将其所在类的包及其子包扫入spring容器中
关于@Import(AutoConfigurationImportSelector.class)
然后下来的关键就是@Import(AutoConfigurationImportSelector.class),上面的@AutoConfigurationPackage是把所在类的包和子包扫入spring容器中,其实也就是把自己写的代码扫到spring容器中。而@Import(AutoConfigurationImportSelector.class)其实就是将第三方的jar包(也有可能是配置文件)引入容器中。
其作用是让Spring Boot自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序。
进入到AutoConfigurationImportSelector的源码中:
当容器启动,它会调用到getAutoConfigurationEntry方法中:
因为通过getCandidateConfigurations方法引入,所以我们进到该方法中去查看:
我们继续进到loadSpringFactories中一探究竟:
然后我们找到了最终想找的东西:spring boot在启动时会根据"META-INF/spring.factories"配置文件找到三方的一些依赖并且引入本项目
然后接下来寻找配置文件"META-INF/spring.factories"的位置:
spring启动的时候会把这些第三方包引入到项目里面来
关于@EnableAutoConfiguration
传统写法会将 自己写的代码、第三方的包 自己进行配置
而spring 提供了@EnableAutoConfiguration会将上面这两部分自动配置。