轉自: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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
