一、什麼是enableAutoConfiguration
在Spring Boot中,enableAutoConfiguration是非常重要的一個組件,它可以方便我們進行Spring Boot應用程序的自動配置。簡單的說,enableAutoConfiguration會自動根據當前項目中添加的依賴來推斷該如何配置Spring應用程序。這很大程度上可以減少程序員的工作量。
二、enableAutoConfiguration的實現機制
當我們添加一個Spring Boot-Starter依賴時,enableAutoConfiguration就會自動進行裝配。Spring Boot提供了AutoConfigurationImportSelector類來幫助我們實現自動裝配。這個類會根據classpath下 META_INF/spring.factories文件中的配置來自動配置我們項目的各種組件。
Spring Boot 2.x版本的spring.factories中自動配置類鍵的前綴是org.springframework.boot.autoconfigure.EnableAutoConfiguration,這個是Spring Boot按照註解方式進行自動裝配的很重要的一個註解。通過這個註解,Spring Boot能夠根據添加的依賴進行動態的自動裝配。
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { private static final Log logger = LogFactory.getLog(AutoConfigurationImportSelector.class); private static final String[] NO_IMPORTS = {}; /** * 基於默@Configuration式的SpringBoot自動裝配機制:SpringApplication的run()方法會觸發AutoConfigurationImportSelector這個類, * 這個類會使用SpringFactoriesLoader的loadFactoryNames()方法加載classpath路徑下所有的META-INF/spring.factories的自動裝配配置後進一步處理。 * 自動配置優先級高於指定配置,最後自動配置完成後再應用指定配置 */ @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } try { AutoConfigurationMetadata metadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = getAttributes(annotationMetadata); List configurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); Set exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = filter(configurations, metadata); fireAutoConfigurationImportEvents(configurations, exclusions); return StringUtils.toStringArray(configurations); } catch (IOException ex) { throw new IllegalStateException(ex); } } }
三、enableAutoConfiguration的使用場景
enableAutoConfiguration使Spring Boot應用程序的啟動變得非常快速和便捷。我們無需手動配置各種組件,只需要添加相應的依賴包就可以了。例如,如果我們需要連接MySQL數據庫,只需要在pom.xml文件中添加mysql-connector-java包的依賴,不用管具體的數據庫連接代碼,enableAutoConfiguration會自動幫我們完成數據庫連接配置。
@SpringBootApplication public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ExampleApplication.class, args); } }
四、enableAutoConfiguration的缺點
雖然enableAutoConfiguration能夠極大地方便我們使用Spring Boot,但是有時候也會出現一些問題。例如,我們在開發時可能會引入多個自動配置庫,這時就會發現自動裝配出現了問題,普通的Java類可能被Spring Boot認為是一個可配置的類。
此外,自動配置可能會受限於Spring Boot版本的支持。對於一些較老的版本,可能存在某些組件無法自動裝配的問題。解決這些問題需要我們手動編寫一些配置代碼。
五、enableAutoConfiguration的配置優先級
對於相同類型的配置,最後加載的配置會覆蓋之前的配置,這意味着配置優先級高的會替換掉配置優先級低的。
在Spring Boot2.x版本中,優先級的定義如下:
- 最高優先級:通過@EnableAutoConfiguration註解的exclude屬性排除組件
- 次高優先級:通過spring.factories中配置的‘application.properties’或‘application.yml’在應用程序級別上進行配置
- 第三優先級:通過帶有@ConfigurationProperties註解的類在應用程序級別上配置
- 第四優先級:通過@ConditionalOnClass註解指定的類存在性進行自動配置
- 第五優先級:通過@ConditionalOnMissingBean註解指定的類不存在時進行自動配置
- 第六優先級:通過@Order註解指定的配置優先級
- 最低優先級:通過@EnableAutoConfiguration註解指定的默認自動配置
@Configuration @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet") public class MyAutoConfiguration { // Custom configuration implementation }
上面的示例代碼中,我們使用了@Order註解來設置了最高優先級,因此這個自動配置類將會覆蓋系統默認的自動配置。
六、總結
enableAutoConfiguration是Spring Boot中非常重要的一個自動裝配組件,它為我們提供了自動裝配的功能,極大地方便了Spring Boot應用程序的開發和配置。在進行使用時,需要注意組件的優先級,避免在使用過程中出現問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/312023.html