一、自动配置的作用
一句话:
在 Spring 启动时,根据"是否存在某些类 / Bean / 配置",自动创建并管理一些 Bean。
二、自动配置六大核心注解
1. @Configuration
作用:
标记一个类为配置类,等同于 XML 配置文件
代码:
java
@Configuration
public class MailAutoConfiguration {
@Bean
public MailService mailService() {
return new MailService();
}
}
| 属性 | 说明 |
|---|---|
proxyBeanMethods = true |
方法调用走代理(保证单例) |
proxyBeanMethods = false |
直接调用(推荐,自动配置常用) |
2. @ConditionalOnClass
作用:
classpath 中存在指定类,配置才生效
代码:
java
@Configuration
@ConditionalOnClass(DataSource.class)
public class JdbcAutoConfiguration {
}
使用场景:
-
starter 是否存在
-
第三方库是否被引入
3. @EnableConfigurationProperties
作用:
把一个
@ConfigurationProperties类注册为 Bean
最小代码:
java
@Configuration
@EnableConfigurationProperties(MailProperties.class)
public class MailAutoConfiguration {
}
没有它的后果:
-
@ConfigurationProperties能读配置 -
但不能被注入
4. @ConfigurationProperties
作用:
把
application.yml中的配置绑定到 Java Bean
最小代码:
java
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
private String host;
private int port;
// getter / setter 必须
}
yml 示例:
java
mail:
host: smtp.qq.com
port: 587
5. @ConditionalOnMissingBean
作用:
当容器中不存在该类型 Bean 时才创建
最小代码:
java
@Bean
@ConditionalOnMissingBean
public MailService mailService() {
return new MailService();
}
使用场景
-
允许用户自定义 Bean
-
自动配置退让
6.@Import
作用
导入其他配置类
最小代码:
java
@Configuration
@Import({AConfig.class, BConfig.class})
public class RootAutoConfiguration {
}
使用场景:
-
拆分复杂自动配置
-
模块化 starter
三、把它们串成一个完整自动配置(重点)
application.yml
mail:
host: smtp.qq.com
port: 587
Properties
java
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
private String host;
private int port;
}
自动配置类
java
@Configuration
@EnableConfigurationProperties(MailProperties.class)
@ConditionalOnClass(MailService.class)
public class MailAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MailService mailService(MailProperties properties) {
return new MailService(properties);
}
}
注册自动配置
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.MailAutoConfiguration
四、总结
**Spring Boot 自动配置 =
@Configuration +
@ConditionalOnClass +
@EnableConfigurationProperties +
@ConfigurationProperties +
@ConditionalOnMissingBean**