触发自动装配的注解
@SpringBootApplication这个注解是一个复合注解,表示这个是启动类
下面有三个子注解:
@SpringBootConfiguration // 注解:标志该类为springboot配置
@EnableAutoConfiguration //启用springboot自动配置/自动转配。
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
//默认扫描当前包及其子包中@Controller,@Service等注解,并把这些bean加载到ioc器中
自动装配源码解析
在这个AutoConfigurationImportSelector类中我们重点关注selectImports()方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
//通过这个类加载器去加载
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
通过源码可以知道,这个classLoader类加载器,就是要去帮我们加载和扫描这个路径"META-INF/spring-autoconfigure-metadata.properties",这个路径就是一个配置文件。
我们去全局收索一下,果然在springboot包里面发现了。
进入后发现有大量的配置,全是完整的全类名
然后也有我们常用的配置,例如:
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration.ConditionalOnClass=javax.sql.DataSource,org.springframework.jdbc.core.JdbcTemplate
springboot把常用的第三方jar包的配置文件都管理在一起,把所有的全类名都记录下来了,当检查到导入了对应的jar包或者说starter(也就是pom文件里面的gav坐标),就可以根据全类名找到配置,根据配置加载想要的bean到IOC容器中。
除了在上面说到的加载配置文件,还有
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);方法也会加载配置
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
//spring的工厂类加载器还会帮我们去加载一些工厂需要的,这个类加载器会从META-INF/spring.factories配置文件中去加载spring自己需要的配置。spring.factories配置如下:
这里会加载两份配置文件:
1、扫描加载 META-INF/spring-autoconfigure-metadata.properties
这里基本定义了绝大对数你可能会用到的三方的一些配置类
2、扫描加载 META-INF/spring.factories
问:以上两份配置文件中定义的bean都会在启动的时候被加载到IOC容器中吗?
答案:不会,简单来说,加了@Configuration注解才会被加入IOC容器,这里还有很多复杂的判断省略...即按需装配对应的Bean
总结:
- 查看底层源码后可以得出Spring Boot自动配置原理:
- @EnableAutoConfiguration注解导入AutoConfigurationImportSelector类。
- 执行selectImports方法调用SpringFactoriesLoader.loadFactoryNames()扫描所有jar下面的对应的META-INF/spring.factories文件.
- 限定为@EnableAutoConfiguration对应的value,将这些装配条件的装配到IOC容器中。
- 自动装配简单来说就是自动将第三方的组件的bean装载到IOC容器内,不需要再去写bean相关的配置,符合约定大于配置理念。
- Spring Boot基于约定大于配置的理念,配置如果没有额外的配置的话,就给按照默认的配置使用约定的默认值,按照约定配置到IOC容器中,无需开发人员手动添加配置,加快开发效率。
面试回答步骤:
- @SpringBootApplication 或 @EnableAutoConfiguration: 在Spring Boot的主类的
main
方法中使用@SpringBootApplication
或者@EnableAutoConfiguration
注解,是启动Spring Boot应用程序的入口。这两个注解会触发Spring Boot自动配置的机制。 - spring.factories 文件: 在项目的依赖中,每个Spring Boot Starter都包含一个
META-INF/spring.factories
文件。这个文件中列出了各个Starter所提供的自动配置类。当Spring Boot应用启动时,它会扫描这些Starter,加载并应用自动配置类。 - 自动配置类的加载: Spring Boot会在启动时扫描项目的依赖中的
spring.factories
文件,找到各个Starter的自动配置类,并加载这些类。 - @Conditional 注解的条件判断: 自动配置类通常会使用
@Conditional
注解来定义一些条件,例如@ConditionalOnClass
、@ConditionalOnMissingBean
等。这些条件会在Spring Boot启动时进行评估,根据条件判断结果来决定是否应用某个自动配置。 - 自动配置与Bean注入: 符合条件的自动配置类会在Spring容器中创建和注册一些Bean。这些Bean通常是应用程序所需的基础设施,如数据源、消息队列、缓存等。这些Bean会根据自动配置的条件和配置信息被注入到Spring的应用上下文中。