一、自动配置的原理
Spring Boot 的自动配置原理主要基于以下几个核心概念和步骤:
1. 条件注解 (Conditional Annotations):Spring Boot 使用 @Conditional 系列注解来决定是否加载某个配置类或 Bean。这些注解包括但不限于:
@ConditionalOnClass :当类路径上存在指定的类时,才会加载配置。
@ConditionalOnMissingBean :当容器中不存在指定的 Bean 时,才会创建该 Bean。
@ConditionalOnProperty :当指定的配置属性存在并符合预期时,才会加载配置。
2. 自动配置类 (Auto-configuration Classes):这些类负责提供默认的配置,它们通过 META-INF/spring.factories 文件被Spring Boot自动加载。
3. 配置属性 (Configuration Properties):通过外部化配置(如 application.properties 或 application.yml 文件),可以控制自动配置的行为。
4. 实现机制:
启用自动配置:在Spring Boot应用的主类上添加 @SpringBootApplication 注解,这个注解内部包含了 @EnableAutoConfiguration ,从而开启自动配置功能。
加载自动配置类:Spring Boot 在启动时会扫描 META-INF/spring.factories 文件,查找所有自动配置类。
条件注解的评估:Spring Boot 根据条件注解来决定是否加载对应的配置类或 Bean。
5. 自定义自动配置:开发者可以创建自己的自动配置类,并通过在 META-INF/spring.factories 文件中注册来让 Spring Boot 加载。
二、自动配置的实现机制
二、自动配置的实现机制
Spring Boot 通过以下步骤实现自动配置:
启用自动配置:在主类上添加 @SpringBootApplication 注解,该注解包含 @EnableAutoConfiguration,开启自动配置功能。
加载自动配置类:Spring Boot 在启动时会扫描 META-INF/spring.factories 文件,找到所有自动配置类。
条件注解的评估:根据条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean 等),决定是否加载对应的配置类或 Bean。
三、自动配置示例
接下来,我们通过具体的代码示例来展示 Spring Boot 自动配置的工作原理。
1. 创建 Spring Boot 项目
首先,创建一个简单的 Spring Boot 项目。在 pom.xml 文件中添加必要的依赖:
<dependencies>
<!--引入自定义的redis-spring-boot-autoconfigure-->
<dependency>
<groupId>com.apesource</groupId>
<artifactId>redis-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-test</artifactId>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
</dependencies>
2. 主类和基本配置
创建一个主类,并添加 @SpringBootApplication 注解:
@SpringBootApplication
public class SpringbootStarter04Application {
@GetMapping("/test")
public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(SpringbootStarter04Application.class, args);
Jedis bean1 = context.getBean(Jedis.class);
System.out.println(bean1);
}
}
3. 自动配置类示例
为了展示自动配置的原理,我们自定义一个自动配置类。假设我们要自动配置一个自定义服务 MyService。
首先,创建RedisAutoconfigration 类:
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoconfiguration {
//注入jedis
@Bean
public Jedis jedis(RedisProperties redisProperties){
return new Jedis(redisProperties.getHost(),redisProperties.getPort());
}
}
在 resources/META-INF/spring.factories 文件中注册自动配置类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.apesource.redisspringbootautoconfigure.RedisAutoconfiguration
4. 使用自定义自动配置
在 Spring Boot 应用中,我们可以直接注入 RedisAutoconfigration 并使用它:
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {
private String host="localhost";
private int port=6379;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
启动应用程序,访问 http://localhost:6379/test,可以看到控制台输出 Bean1的地址。