自动配置原理入门
加载自动配置类
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
点击注解@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
-
@SpringBootConfiguration
- @Configuration
说明这也是一个配置类
-
@ComponentScan
过滤扫描那些包,那些类
-
@EnableAutoConfiguration
-
@AutoConfigurationPackage 指定了默认的包规则
-
@Import({Registrar.class})
自动配置包,指定了默认的包规则
点Registra进去可以看到:
-
-
@Import({AutoConfigurationImportSelector.class})
点AutoConfigurationImportSelector进去可以看到
getAutoConfigurationEntry(annotationMetadata)
点击获取一些候选的配置这个方法
点击loadFactoryNames方法
点击loadSpringFactories方法
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件,图中标注为核心包
在项目jar中可以看到
可以看到spring.factories文件中的信息就包含了getAutoConfigurationEntry(annotationMetadata)返回的configurations集合信息,有133个,当前Springboot的版本为2.6.11, 版本不同加载配置个数不同
总结:
- @Import({Registrar.class})的registerBeanDefinitions()方法指定了默认的包规则,也就是启动类所在的包
- 利用getAutoConfigurationEntry(annotationMetadata) 批量注册了一系列的配置组件
- 利用List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取了所有需要注册到容器中的类信息
- 利用Map<String, List> loadSpringFactories(ClassLoader classLoader)工厂加载模式,得到所有组件
- 从META-INF/spring.factories位置来加载一个文件,默认扫描所有,spring-boot-autoconfigure-2.6.11.RELEASE.jar这个是核心包
-
按需开启自动配置类
默认的133个配置组件会全部加载,但并不是全部生效
最终会按照条件装配规则,按需加载
-
我们可以选择一个类进行验证,点击进入aop配置组件
-
可以看到,我们没有引aop的包
-
在pom.xml文件中添加aop的启动类
(官网地址:https://docs.spring.io/spring-boot/docs/2.6.11/reference/html/using.html#using.buil-systems.starters)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
刷新maven后,可以看到当前配置类中爆红已经消失了
-
这也就说明,我们要想使用Springboot配置的这些默认组件,只需要在pom.xml中引入各自的启动类即可