欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot排除不需要的自動(dòng)配置類DataSourceAutoConfiguration問題

 更新時(shí)間:2024年07月11日 14:38:02   作者:山河錦繡  
這篇文章主要介紹了SpringBoot排除不需要的自動(dòng)配置類DataSourceAutoConfiguration問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、排除自動(dòng)配置類的三種方式

以下三種方式可以用來排除任意的自動(dòng)配置類

1.1使用@SpringBootApplication注解排除

使用exclude屬性(value是Class對(duì)象數(shù)組)

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

或者excludeName屬性(value是類的全限定名字符串?dāng)?shù)組)

@SpringBootApplication(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

1.2使用@EnableAutoConfiguration注解排除

1.在項(xiàng)目中創(chuàng)建一個(gè)配置類對(duì)象MyConfig.class,在配置類上使用@EnableAutoConfiguration注解。

使用exclude屬性(value是Class對(duì)象數(shù)組)

@Configuration
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class MyConfig {
}

或者excludeName屬性(value是類的全限定名字符串?dāng)?shù)組)

@Configuration
@EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})
public class MyConfig {
}

思考1:為什么不能直接在啟動(dòng)類上使用@EnableAutoConfiguration注解,而要重新創(chuàng)建一個(gè)配置類?

因?yàn)锧SpringBootApplication已經(jīng)繼承了@EnableAutoConfiguration,并且@EnableAutoConfiguration注解,是不可在類上重復(fù)使用的注解(換句話說就是使用@SpringBootApplication注解,就相當(dāng)于使用了@EnableAutoConfiguration注解)

所以 我們會(huì)發(fā)現(xiàn)方法一與方法二本質(zhì)上是一樣的只是形式上的差別,底層都是依賴于@EnableAutoConfiguration注解實(shí)現(xiàn)的排除功能。

思考2:@SpringBootApplication注解與@EnableAutoConfiguration的關(guān)系?為什么在@SpringBootApplication注解中配置屬性底層還是使用@EnableAutoConfiguration實(shí)現(xiàn)的呢?

@SpringBootApplication注解源碼:

@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 {

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

我們可以看出源碼中使用了注解:

@AliasFor(annotation = EnableAutoConfiguration.class)

將@SpringBootApplication的exclude和excludeName屬性與@EnableAutoConfiguration的屬性做了一個(gè)橋接的作用。

1.3.在yml配置文件中添加排除配置

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

注:如果要排除多個(gè)類,使用逗號(hào)隔開

二、為什么可以這樣排除,內(nèi)在邏輯原理研究

springBoot將自動(dòng)配置類添入到spring容器中的部分源碼:

	protected AutoConfigurationEntry getAutoConfigurationEntry(
			AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
        //獲取注解中配置的需要排除的自動(dòng)配置類信息
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
        //獲取項(xiàng)目中所有的自動(dòng)配置類
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		configurations = removeDuplicates(configurations);
        //獲取配置文件中配置的需要排除的類信息,并與之前的注解中配置的數(shù)據(jù)整合在一起
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
        //將需要排除的類信息刪除
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAutoConfigurationImportEvents(configurations, exclusions);
        //返回最終需要的自動(dòng)配置類
		return new AutoConfigurationEntry(configurations, exclusions);
	}
  • 1.這段代碼中的主要邏輯就是,將項(xiàng)目中所有需要的自動(dòng)配置類的全限定名以字符串?dāng)?shù)組返回出去,后續(xù)spring容器會(huì)將所有的配置類創(chuàng)建成Bean
  • 2.所以我們?nèi)N配置排除自動(dòng)配置類的行為,最終都會(huì)在這段代碼邏輯中體現(xiàn)出來,在spring容器初始化他們之前,我們就已經(jīng)提前把他們從初始化的名單中排除了
  • 3.我們配置的時(shí)候?yàn)槭裁炊际鞘褂玫念惖娜薅谶@里也得到了解釋,因?yàn)橹挥惺褂萌薅鹲pring容器才能將其創(chuàng)建成對(duì)象。
  • 4.還可以得出結(jié)論就是幾種方式可以同時(shí)使用,最終排除的是他們的并集

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn)

    SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn)

    FreeMarker它允許開發(fā)人員使用模板和數(shù)據(jù)來生成輸出文本,如HTML網(wǎng)頁、電子郵件、配置文件和源代碼等,本文主要介紹了SpringBoot結(jié)合FreeMarker視圖渲染的實(shí)現(xiàn),感興趣的可以了解一下
    2024-03-03
  • springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄(思路詳解)

    springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄(思路詳解)

    這篇文章主要介紹了springboot實(shí)現(xiàn)jar運(yùn)行復(fù)制resources文件到指定的目錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java面向?qū)ο蠡A(chǔ)知識(shí)之枚舉

    Java面向?qū)ο蠡A(chǔ)知識(shí)之枚舉

    這篇文章主要介紹了Java面向?qū)ο蟮闹杜e,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-11-11
  • Java中Static關(guān)鍵字的五種用法詳解

    Java中Static關(guān)鍵字的五種用法詳解

    這篇文章主要介紹了Java中static的五種用法:修飾成員變量,修飾成員方法,修飾內(nèi)部類,靜態(tài)代碼塊,靜態(tài)導(dǎo)包,想詳細(xì)了解的小伙伴可以參考閱讀本文
    2023-03-03
  • 并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義

    并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義

    這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義,鎖的作用是讓臨界區(qū)互斥執(zhí)行,本文只要圍繞鎖的內(nèi)存語義展開全文內(nèi)容,需要的小伙伴可以參考一下
    2021-11-11
  • Android?Java判斷密碼強(qiáng)度方法實(shí)例(強(qiáng)度顯示)

    Android?Java判斷密碼強(qiáng)度方法實(shí)例(強(qiáng)度顯示)

    在現(xiàn)代社會(huì)中,密碼是確保我們個(gè)人信息和賬戶安全的重要手段之一,為了提高密碼的安全性,我們可以使用正則表達(dá)式來判斷密碼的強(qiáng)度,這篇文章主要給大家介紹了關(guān)于Android?Java判斷密碼強(qiáng)度(強(qiáng)度顯示)的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • java 判斷二進(jìn)制文件的方法

    java 判斷二進(jìn)制文件的方法

    這篇文章主要介紹了java 判斷二進(jìn)制文件的方法的相關(guān)資料,這里提供實(shí)例來實(shí)現(xiàn)判斷文件是否問二進(jìn)制文件,希望能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java實(shí)現(xiàn)簡(jiǎn)單局域網(wǎng)聊天室

    Java實(shí)現(xiàn)簡(jiǎn)單局域網(wǎng)聊天室

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單局域網(wǎng)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java實(shí)戰(zhàn)之多線程模擬站點(diǎn)售票

    Java實(shí)戰(zhàn)之多線程模擬站點(diǎn)售票

    今天帶大家來練習(xí)Java實(shí)戰(zhàn),文中多線程模擬站點(diǎn)售票這個(gè)問題作了詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論