目录
(2)AutoConfigurationImportSelector
[(3) SpringFactoriesLoader](#(3) SpringFactoriesLoader)
[(5) @Conditional相关注解](#(5) @Conditional相关注解)
[(6) 配置属性绑定](#(6) 配置属性绑定)
在开始学习之前,先简单介绍几个关键组件:
1.@EnableAutoConfiguration注解
这是启动自动配置的主要注解,通常在主应用类上使用。它启用了Spring Boot的自动配置机制。通过这个注解,Spring Boot 可以根据所添加的依赖自动配置相应的 Beans。例如,如果类路径下有Mybatis的JAR包,MybatisAutoConfiguration注解就能根据相关参数来配置Mybatis的各个Spring Bean.
下面是一个简单的示例代码,展示了如何使用 @EnableAutoConfiguration 注解创建一个 Spring Boot 应用程序:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在这个示例中,@SpringBootApplication 是一个组合注解,其中包含了 @EnableAutoConfiguration。因此,当在类上使用 @SpringBootApplication 时,实际上就启用了自动配置。如果只想使用 @EnableAutoConfiguration,可以这样写:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@EnableAutoConfiguration
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在这个示例中,同样是启用了自动配置,但没有使用 @SpringBootApplication。需要注意的是:使用 @SpringBootApplication 还会启用其他的功能,例如组件扫描和配置属性。
2.@SpringBootConfiguration注解
用于指示一个类是 Spring Boot 应用的配置类。该注解实际上是@Configuration 的一个变体,并且它提供了一些额外的功能来支持 Spring Boot 的自动配置特性。
这个注解的主要作用是表明这个类是用来定义 Spring 应用上下文的 Bean 的,并且它通常用于作为 Spring Boot 应用程序的入口点。
代码示例:
java
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@SpringBootConfiguration
public class MyAppConfiguration {
@Bean
public MyBean myBean() {
// 返回MyBean的一个实例
return new MyBean();
}
}
3.@Import注解
该注解是 Spring 框架中的一个重要特性,允许将其他配置类或普通类导入到当前配置类中,从而利用这些类作为 Spring 上下文的一部分。这通常用于将多个配置类组织在一起,以便在需要时进行管理。
示例代码;
示例 1:导入配置类
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(OneConfiguration.class})
public class MainConfiguration {
@Bean
public String mainBean() {
return "Bean";
}
}
@Configuration
class OneConfiguration {
@Bean public String oneBean() {
return "One Bean";
}
}
在此示例中,
MainConfiguration
类通过@Import
注解导入了OneConfiguration
类,这样OneConfiguration
中定义的 bean 也会被注册到 Spring 上下文中。
示例 2:导入普通类
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({UserService.class})
public class BootConfig {
@Bean
public String bootBean() {
return "Boot Bean";
}
}
class UserService {
public void do() {
System.out.println("User Service");
}
}
4.spring.factories
是一个关键的配置文件,位于
META-INF
目录下。这个文件用于定义Spring Boot应用程序启动时需要加载的自动配置类。当Spring Boot应用程序启动时,@EnableAutoConfiguration注解触发自动配置,它会通过SpringFactoriesLoader类加载spring.factories文件中列出的所有自动配置类。
java
# 自定义自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ape.starter.MyAutoConfiguration
java
# 指定自动配置类,这些类将被Spring Boot的自动配置机制加载
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
...
5.总结
Spring Boot的自动配置原理基于以下几个关键组件和步骤:
(1)@EnableAutoConfiguration
这个注解是自动配置的核心,它告诉Spring Boot根据类路径中的库和依赖来自动配置Spring应用。@EnableAutoConfiguration通过@Import引入AutoConfigurationImportSelector类,后者负责加载自动配置。
(2)AutoConfigurationImportSelector
AutoConfigurationImportSelector是一个DeferredImportSelector的实现,它会在Spring上下文的所有`@Configuration类加载完成后执行。它负责从spring.factories文件中读取自动配置类列表,并根据条件决定哪些配置类应该被加载。
(3) SpringFactoriesLoader
SpringFactoriesLoader是一个Spring框架的工具类,用于加载classpath下的`META-INF/spring.factories文件。这个文件包含了自动配置类列表,SpringFactoriesLoader`将这些类名解析为具体的类对象。
(4)META-INF/spring.factories
spring.factories文件位于每个Spring Boot自动配置模块的META-INF目录下。它定义了自动配置类,这些类是实现自动配置的Java配置类,通常使用@Configuration注解标注。
(5) @Conditional相关注解
自动配置类通常结合@Conditional相关注解使用,例如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnProperty等。这些条件注解控制配置类在何种条件下生效。
(6) 配置属性绑定
使用@ConfigurationProperties注解将配置文件中的属性绑定到Java Bean上,使得配置信息可以被Spring容器管理的Bean使用。
(7)自动配置类加载
Spring Boot启动时,会根据spring.factories文件中定义的自动配置类列表,结合条件注解的判断结果,动态地加载和注册Bean到Spring应用上下文中。