SpringBoot中@AutoConfiguration和@Configuration區(qū)別
@AutoConfiguration 是 Spring Boot 2.4 引入的一個(gè)新注解,用于標(biāo)記自動(dòng)配置類。它是對(duì)傳統(tǒng) @Configuration 注解的增強(qiáng),專門用于自動(dòng)配置場(chǎng)景。
@AutoConfiguration 注解詳解
1. 基本作用
@AutoConfiguration 是一個(gè)復(fù)合注解,主要用于標(biāo)識(shí)自動(dòng)配置類,它提供了比 @Configuration 更明確的語(yǔ)義和更好的功能。
2. 注解定義
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface AutoConfiguration {
/**
* 自動(dòng)配置類的處理順序
*/
AutoConfigurationPhase before() default AutoConfigurationPhase.NONE;
/**
* 在指定的自動(dòng)配置類之后處理
*/
Class<?>[] after() default {};
/**
* 在指定的自動(dòng)配置類之前處理
*/
Class<?>[] before() default {};
}
3. 與 @Configuration 的區(qū)別
// 傳統(tǒng)方式
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 配置內(nèi)容
}
// 新方式(推薦)
@AutoConfiguration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 配置內(nèi)容
}
4. 主要特性
4.1 明確的語(yǔ)義(使用@Configuration的類只知道是一個(gè)配置類,并不知道是自動(dòng)配置類)
// 明確表示這是一個(gè)自動(dòng)配置類
@AutoConfiguration
@ConditionalOnClass(RedisTemplate.class)
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public RedisTemplate redisTemplate() {
return new RedisTemplate();
}
}
4.2 排序控制
// 控制自動(dòng)配置的執(zhí)行順序
@AutoConfiguration(
before = DataSourceAutoConfiguration.class,
after = WebMvcAutoConfiguration.class
)
@ConditionalOnClass(DataSource.class)
public class CustomDataSourceAutoConfiguration {
// 配置內(nèi)容
}
5. 實(shí)際應(yīng)用示例
5.1 基礎(chǔ)自動(dòng)配置類
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyServiceProperties properties) {
MyServiceImpl service = new MyServiceImpl();
service.setConfig(properties);
return service;
}
}
5.2 帶排序的自動(dòng)配置(決定當(dāng)前自動(dòng)配置類,在誰(shuí)創(chuàng)建之前或者之后配置)
@AutoConfiguration(
before = {DataSourceAutoConfiguration.class},
after = {WebMvcAutoConfiguration.class}
)
@ConditionalOnClass(CacheManager.class)
@EnableConfigurationProperties(CacheProperties.class)
public class CacheAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public CacheManager cacheManager(CacheProperties properties) {
return new CustomCacheManager(properties);
}
}
5.3 條件化自動(dòng)配置
@AutoConfiguration
@ConditionalOnWebApplication
@ConditionalOnClass(Servlet.class)
@ConditionalOnProperty(prefix = "my.web", name = "enabled", havingValue = "true", matchIfMissing = true)
public class WebAutoConfiguration {
@Bean
public WebInterceptor webInterceptor() {
return new WebInterceptor();
}
@Bean
public WebFilter webFilter() {
return new WebFilter();
}
}
6. 與其他注解的配合使用
6.1 與條件注解配合
@AutoConfiguration
@ConditionalOnClass(JdbcTemplate.class)
@ConditionalOnProperty(name = "my.jdbc.enabled", havingValue = "true", matchIfMissing = true)
public class JdbcAutoConfiguration {
@Bean
@Primary
@ConditionalOnMissingBean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
6.2 與屬性配置注解配合
@AutoConfiguration
@EnableConfigurationProperties({
DatabaseProperties.class,
ConnectionProperties.class
})
@ConditionalOnClass(DataSource.class)
public class DatabaseAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DatabaseProperties dbProps, ConnectionProperties connProps) {
// 創(chuàng)建數(shù)據(jù)源
return createDataSource(dbProps, connProps);
}
}
7. 優(yōu)勢(shì)和特點(diǎn)
7.1 語(yǔ)義明確
- 明確標(biāo)識(shí)這是一個(gè)自動(dòng)配置類
- 提高代碼可讀性和維護(hù)性
7.2 排序支持
@AutoConfiguration(
before = DataSourceAutoConfiguration.class,
after = WebMvcAutoConfiguration.class
)
7.3 與Spring Boot生態(tài)系統(tǒng)集成
- 與
spring.factories或AutoConfiguration.imports文件配合使用 - 支持Spring Boot的條件化配置機(jī)制
8. 完整示例
// 自定義屬性配置類
@ConfigurationProperties(prefix = "myapp.service")
public class MyServiceProperties {
private String url = "http://localhost:8080";
private int timeout = 5000;
private boolean enabled = true;
// getters and setters
}
// 自動(dòng)配置類
@AutoConfiguration
@ConditionalOnClass(MyService.class)
@ConditionalOnProperty(prefix = "myapp.service", name = "enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyServiceProperties properties) {
MyService service = new MyServiceImpl();
service.setUrl(properties.getUrl());
service.setTimeout(properties.getTimeout());
return service;
}
@Bean
@ConditionalOnMissingBean
public MyServiceClient myServiceClient(MyService myService) {
return new MyServiceClient(myService);
}
}
9. 最佳實(shí)踐
- 使用明確的語(yǔ)義:優(yōu)先使用
@AutoConfiguration而不是@Configuration - 合理的條件注解:結(jié)合使用
@ConditionalOnClass、@ConditionalOnMissingBean等 - 屬性配置:使用
@EnableConfigurationProperties管理配置屬性 - 排序控制:必要時(shí)使用
before和after屬性控制執(zhí)行順序 - 文檔注釋:為自動(dòng)配置類添加清晰的文檔說明
@AutoConfiguration 注解使自動(dòng)配置類的意圖更加明確,提供了更好的排序控制,并且是Spring Boot 2.4+推薦的標(biāo)準(zhǔn)做法。
到此這篇關(guān)于 SpringBoot中@AutoConfiguration和@Configuration區(qū)別的文章就介紹到這了,更多相關(guān) SpringBoot @AutoConfiguration @Configuration內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot?注解?@AutoConfiguration?在?2.7?版本中被新增的使用方法詳解
- springboot使用@ConfigurationProperties實(shí)現(xiàn)自動(dòng)綁定配置參數(shù)屬性
- SpringBoot中的@ConfigurationProperties注解的使用
- SpringBoot中@ConfigurationProperties自動(dòng)獲取配置參數(shù)的流程步驟
- Springboot之@ConfigurationProperties注解解讀
- SpringBoot中的@ConfigurationProperties注解解析
- 關(guān)于SpringBoot的@ConfigurationProperties注解和松散綁定、數(shù)據(jù)校驗(yàn)
相關(guān)文章
Spring MVC 請(qǐng)求參數(shù)綁定實(shí)現(xiàn)方式
Spring MVC 是一個(gè)用于構(gòu)建 Web 應(yīng)用程序的框架,它提供了一種方便的方式來處理 HTTP 請(qǐng)求和響應(yīng),Spring MVC 提供了多種方式來實(shí)現(xiàn)請(qǐng)求參數(shù)綁定,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友跟隨小編一起看看吧2023-09-09
淺談如何優(yōu)雅地停止Spring Boot應(yīng)用
這篇文章主要介紹了淺談如何優(yōu)雅地停止Spring Boot應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
SpringCloud中數(shù)據(jù)認(rèn)證加密的方法總結(jié)
在當(dāng)今分布式系統(tǒng)的日益復(fù)雜和信息傳遞的廣泛網(wǎng)絡(luò)化環(huán)境中,數(shù)據(jù)的加密和認(rèn)證作為保障信息傳遞安全的關(guān)鍵手段,Spring?Cloud,作為一套構(gòu)建微服務(wù)架構(gòu)的強(qiáng)大框架,提供了多種靈活而強(qiáng)大的數(shù)據(jù)加密和認(rèn)證方式,本文給大家總結(jié)了SpringCloud數(shù)據(jù)認(rèn)證加密的方法2024-03-03
BeanUtils.copyProperties擴(kuò)展--實(shí)現(xiàn)String轉(zhuǎn)Date
這篇文章主要介紹了BeanUtils.copyProperties擴(kuò)展--實(shí)現(xiàn)String轉(zhuǎn)Date操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn),我們知道SpringBoot自己在“后臺(tái)”幫我們配置了很多原本需要我們手動(dòng)去的東西,至于這個(gè)“后臺(tái)”是啥,就是Starter機(jī)制2022-09-09

