十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
SpringBoot自動(dòng)配置是SpringBoot框架的一個(gè)重要特性,它可以簡(jiǎn)化開(kāi)發(fā)者的配置工作,提高開(kāi)發(fā)效率,自動(dòng)配置的核心思想是根據(jù)項(xiàng)目中的依賴(lài)關(guān)系和配置信息,自動(dòng)為項(xiàng)目提供合適的默認(rèn)配置,這種方式可以讓開(kāi)發(fā)者在不修改代碼的情況下,快速地搭建起一個(gè)完整的項(xiàng)目,本文將詳細(xì)介紹SpringBoot自動(dòng)配置的原理及其實(shí)現(xiàn)方式。

1、自動(dòng)配置的概念
自動(dòng)配置是指在SpringBoot應(yīng)用啟動(dòng)時(shí),根據(jù)項(xiàng)目的依賴(lài)關(guān)系和配置信息,自動(dòng)為項(xiàng)目提供合適的默認(rèn)配置,這種方式可以讓開(kāi)發(fā)者在不修改代碼的情況下,快速地搭建起一個(gè)完整的項(xiàng)目。
2、自動(dòng)配置的實(shí)現(xiàn)
SpringBoot自動(dòng)配置的實(shí)現(xiàn)主要依賴(lài)于以下幾個(gè)方面:
(1)SpringBoot的@EnableAutoConfiguration注解:這個(gè)注解告訴SpringBoot啟用自動(dòng)配置功能。
(2)spring.factories文件:這個(gè)文件位于項(xiàng)目的resources目錄下,用于存儲(chǔ)自動(dòng)配置類(lèi)的全類(lèi)名,當(dāng)SpringBoot啟動(dòng)時(shí),會(huì)加載這個(gè)文件,并根據(jù)其中的信息創(chuàng)建相應(yīng)的Bean實(shí)例。
(3)條件注解:SpringBoot自動(dòng)配置支持使用條件注解來(lái)控制Bean的創(chuàng)建。@ConditionalOnClass、@ConditionalOnMissingBean等注解可以根據(jù)不同的條件來(lái)決定是否創(chuàng)建Bean。
(4)自定義配置類(lèi):開(kāi)發(fā)者可以通過(guò)繼承AbstractAutoConfiguration類(lèi)或?qū)崿F(xiàn)AutoConfiguration接口來(lái)自定義自動(dòng)配置類(lèi),這些類(lèi)需要使用@Configuration注解進(jìn)行標(biāo)注,并在spring.factories文件中注冊(cè)。
1、環(huán)境變量配置:通過(guò)設(shè)置環(huán)境變量,可以控制應(yīng)用的各種參數(shù),SpringBoot自動(dòng)配置可以根據(jù)環(huán)境變量的值來(lái)選擇合適的默認(rèn)配置。
2、數(shù)據(jù)庫(kù)驅(qū)動(dòng)配置:SpringBoot自動(dòng)配置可以根據(jù)項(xiàng)目中的依賴(lài)關(guān)系,自動(dòng)為項(xiàng)目提供合適的數(shù)據(jù)庫(kù)驅(qū)動(dòng),這樣,開(kāi)發(fā)者無(wú)需手動(dòng)添加和配置數(shù)據(jù)庫(kù)驅(qū)動(dòng),大大提高了開(kāi)發(fā)效率。
3、第三方庫(kù)配置:SpringBoot自動(dòng)配置還可以根據(jù)項(xiàng)目中的依賴(lài)關(guān)系,自動(dòng)為項(xiàng)目提供合適的第三方庫(kù)的默認(rèn)配置,可以自動(dòng)配置Redis、MyBatis等組件。
1、如何關(guān)閉自動(dòng)配置?
答:可以通過(guò)在application.properties或application.yml文件中添加以下配置來(lái)關(guān)閉自動(dòng)配置:
application.properties spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
application.yml
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
2、如何自定義自動(dòng)配置類(lèi)?
答:可以通過(guò)繼承AbstractAutoConfiguration類(lèi)或?qū)崿F(xiàn)AutoConfiguration接口來(lái)自定義自動(dòng)配置類(lèi),然后在spring.factories文件中注冊(cè)這個(gè)類(lèi)。
package com.example;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import javax.sql.DataSource;
@Configuration
@ConditionalOnProperty(prefix = "datasource", name = "enabled", havingValue = "true")
@EnableConfigurationProperties(DatasourceProperties.class)
@Import({DataSourceAutoConfiguration.class})
public class MyDatasourceAutoConfiguration {
}
3、如何實(shí)現(xiàn)自定義條件注解?
答:可以通過(guò)繼承Condition接口來(lái)實(shí)現(xiàn)自定義條件注解,然后重寫(xiě)matches方法,根據(jù)不同的條件返回true或false。
package com.example; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.util.StringUtils; import java.util.function.Supplier; import static org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency; import static org.springframework.util.StringUtils.hasText; import static org.springframework.util.StringUtils.isEmpty; import static org.springframework.util.StringUtils$class; // for hasText() method reference on null values (see SPR-1680) and isEmpty() method reference on empty values (see SPR-1680) in Spring Framework >=5/4/3 (see https://github.com/spring-projects/spring-framework/issues/1680) or on non-null values with StringUtilsisNotBlank() (see SPR-1790). For more information see the documentation of StringUtils and the Condition interface: https://docs.spring.io/spring-framework/docs/current/reference/htmlsingle/common-annotation-based-conditions and https://docs.spring.io/spring-framework/docs/current/reference/htmlsingle/condition-annotation