首先是从程序启动类上的@SpringBootApplication
注解点进去我们会发现这个是一个组合注解
主要包括@ComponentScan、@EnableAutoConfiguration 、@SpringBootConfiguration 和元注解组成
我们主要来看这@ComponentScan、@EnableAutoConfiguration 、@SpringBootConfiguration三大注解
1.@SpringBootConfiguration 与普通 @Configuration 相比,唯一区别是前者要求整个 app 中只出现一次
2.@ComponentScan扫描指定注解的类注册到IOC容器中,包括@Controller、@Service、@Component、@Repository等等,其作用等同于<context:component-scan base-package="com.lexed.study" />配置。
excludeFilters - 用来在组件扫描时进行排除,也会排除自动配置类
3.@EnableAutoConfiguration 也是一个组合注解
主要由@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)组成
1)@AutoConfigurationPackage – 用来记住扫描的起始包
2)@Import(AutoConfigurationImportSelector.class) 用来加载 META-INF/spring.factories
中的自动配置类
为什么不使用 @Import 直接引入自动配置类
1)让主配置类和自动配置类变成了强耦合,主配置类不应该知道有哪些从属配置
2)直接用 @Import(自动配置类.class)
,引入的配置解析优先级较高,自动配置类的解析应该在主配置没提供时作为默认配置
因此,采用了 @Import(AutoConfigurationImportSelector.class)
-
由
AutoConfigurationImportSelector.class
去读取META-INF/spring.factories
中的自动配置类,实现了弱耦合。 -
另外
AutoConfigurationImportSelector.class
实现了 DeferredImportSelector 接口,让自动配置的解析晚于主配置的解析
谢谢大家!!!