關於@EnableAutoConfiguration注解


轉自:https://www.jianshu.com/p/35685394c1fc

1 關於@EnableAutoConfiguration注解

我們使用springBoot創建一個項目時,我們會發現我們的項目啟動類有@SpringBootApplication
如下:

@EnableTransactionManagement @ServletComponentScan @MapperScan({"com.txdata.*.*.dao","com.txdata.*.dao"}) @SpringBootApplication @EnableCaching public class TxdataApplication { public static void main(String[] args) { SpringApplication.run(TxdataApplication.class, args); System.out.println("ヾ(◍°∇°◍)ノ゙ 項目啟動成功 "); } } 

點進這個注解進去看實現,如下:

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.boot.autoconfigure; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.context.TypeExcludeFilter; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.core.annotation.AliasFor; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { @AliasFor( annotation = EnableAutoConfiguration.class ) Class<?>[] exclude() default {}; @AliasFor( annotation = EnableAutoConfiguration.class ) String[] excludeName() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackages" ) String[] scanBasePackages() default {}; @AliasFor( annotation = ComponentScan.class, attribute = "basePackageClasses" ) Class<?>[] scanBasePackageClasses() default {}; } 

我們可以發現該注解上面已包含@EnableAutoConfiguration。
@EnableAutoConfiguration:啟用 SpringBoot 的自動配置機制
@ComponentScan: 掃描被@Component (@Service,@Controller)注解的 bean,注解默認會掃描該類所在的包下所有的類。
@SpringBootConfiguration:允許在 Spring 上下文中注冊額外的 bean 或導入其他配置類

@EnableAutoConfiguration作用:
幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot,並創建對應配置類的Bean,並把該Bean實體交給IoC容器進行管理。

@EnableAutoConfiguration的實現代碼如下:

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.boot.autoconfigure; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.context.annotation.Import; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; } 

關於這個注解的實現原理自行百度,我現今一個入門小白也只能理解到這兒~(百度一下網上一大堆的 = - =!)

2 關於@EnableAutoConfiguration注解使用問題

比如說:我們的項目啟動類上面已經講到包含了該注解了,默認會掃描與項目啟動類同級或者更低級目錄下的所有使用@Configuration注解的類,如果我們想要避開某些配置類的掃描(包括避開一些第三方jar包下面的配置),
我們可以進行如下操作:

package com.txdata; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.cache.annotation.EnableCaching; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableAutoConfiguration(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) @EnableTransactionManagement @ServletComponentScan @MapperScan({"com.txdata.*.*.dao","com.txdata.*.dao"}) @SpringBootApplication @EnableCaching public class TxdataApplication { public static void main(String[] args) { SpringApplication.run(TxdataApplication.class, args); System.out.println("ヾ(◍°∇°◍)ノ゙ txdata啟動成功 "); } // @Override // protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // return builder.sources(TxdataApplication.class); // } } 
避開配置掃描關鍵:
@EnableAutoConfiguration(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) 

這樣,在項目啟動的時候就不會去掃描exclude后面的配置類。

反思:

如果在項目啟動類不進行上面的"避開"操作,而在項目的某一個具體的配置類進行上述"避開"操作,效果會一樣嗎?
代碼如下:
啟動類(不進行"避開"操作)

package com.txdata; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.cache.annotation.EnableCaching; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @ServletComponentScan @MapperScan({"com.txdata.*.*.dao","com.txdata.*.dao"}) @SpringBootApplication @EnableCaching public class TxdataApplication { public static void main(String[] args) { SpringApplication.run(TxdataApplication.class, args); System.out.println("ヾ(◍°∇°◍)ノ゙ txdata啟動成功 "); } // @Override // protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // return builder.sources(TxdataApplication.class); // } } 

某個配置類(進行"避開"操作)

package com.txdata.common.config; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; @EnableAutoConfiguration(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) @Configuration public class SecuityConfig { } 

效果會一樣嗎?(等過段時間理解了原理再回答這個問題~)

:"避開"操作放在不同地方會有不同效果,放在啟動類的話,是針對整個項目的所有文件;放在具體某個配置類的話,是針對該配置類文件(作用范圍不同)。



作者:Isak_e7c4
鏈接:https://www.jianshu.com/p/35685394c1fc
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM