1.自动配置功能简介
Spring Boot 的自动配置功能是其核心特性之一,旨在简化 Spring 应用的配置。它通过条件化注解和自动注册 Bean 的方式,根据项目的依赖和环境动态地启用或禁用特定功能,从而减少开发者的手动配置工作。
Spring Boot 自动配置的核心原理如下:
@EnableAutoConfiguration
注解
该注解用于启用自动配置,它会扫描spring.factories
文件中注册的自动配置类(在spring-boot-autoconfigure
模块中)。条件注解(Conditional Annotations)
Spring Boot 通过以下注解判断是否满足条件来注册 Bean:@ConditionalOnClass
:当类路径中存在某个类时才生效。@ConditionalOnMissingBean
:当容器中不存在某个 Bean 时才创建。@ConditionalOnProperty
:当配置文件中某个属性为指定值时才生效。
自动配置类
自动配置类通常是带有@Configuration
注解的类,里面定义了多个 Bean,并结合条件注解实现按需配置。
2.使用示例
以一个邮件服务的自动配置为例,展示 Spring Boot 如何根据依赖自动注册邮件相关的 Bean。
2.1自动配置过程
step1.定义 MailService
接口
package com.example.autoconfigure;
public interface MailService {
void send(String to, String subject, String content);
}
step2.实现 MailService
package com.example.autoconfigure;
public class MailServiceImpl implements MailService {
@Override
public void send(String to, String subject, String content) {
System.out.println("Sending email to: " + to);
System.out.println("Subject: " + subject);
System.out.println("Content: " + content);
}
}
step3.定义自动配置类
package com.example.autoconfigure;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.mail.Session;
@Configuration
@ConditionalOnClass(Session.class) // 仅当类路径中存在 Session 类时才生效
public class MailAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 如果容器中没有定义 MailService,则自动创建
public MailService mailService() {
return new MailServiceImpl();
}
}
step4. 在 spring.factories
中注册自动配置类
在 src/main/resources/META-INF/spring.factories
中添加:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.MailAutoConfiguration
注意:
- 在
spring.factories
中注册自动配置类,是为了让Spring Boot在启动时通过@EnableAutoConfiguration
触发自动配置。 - 而开发者使用@Configuration定义的普通配置类无需该步骤,普通配置类是通过组件扫描(
@ComponentScan
)或@Import
加载
2.2 使用自动配置
创建主类并测试自动配置:
- 其中@SpringBootApplication是一个组合注解,包含@EnableAutoConfiguration,可用于启用 SpringBoot 的自动配置机制。
package com.example.demo;
import com.example.autoconfigure.MailService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
MailService mailService = context.getBean(MailService.class);
mailService.send("user@example.com", "Hello", "Welcome to Spring Boot!");
}
}
配置与排除自动配置
可以在 application.properties
中控制自动配置行为:
# 禁用某个自动配置类
spring.autoconfigure.exclude=com.example.autoconfigure.MailAutoConfiguration
或者通过 @SpringBootApplication
注解的 exclude
参数:
@SpringBootApplication(exclude = MailAutoConfiguration.class)
public class DemoApplication {
...
}