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

關(guān)于@Configuration的作用說明

 更新時間:2023年01月01日 12:28:24   作者:qiuz1024  
這篇文章主要介紹了關(guān)于@Configuration的作用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、問題描述

在項目中,通常都會配置一個或者多個加了@Configuration注解的配置類,那么@Configuration這個注解到底有神馬作用勒?

@ComponentScan("com")
public class AppConfig {
?? ?@Bean
?? ?public TestDao testDao() {
?? ??? ?return new TestDao();
?? ?}
}
public class Test {
?? ?public static void main(String[] args) {
?? ??? ?AnnotationConfigApplicationContext acc = new AnnotationConfigApplicationContext(AppConfig.class);
?? ?}
}
public class TestDao {
?? ?public TestDao(){
?? ??? ?System.out.println("testDao");
?? ?}

}

執(zhí)行上面的代碼,我們會發(fā)現(xiàn)當我們不加@Configuration這個注解的時候我們的TestDao 這個類還是還是會被實例化,也會打印testDao。我們的spring環(huán)境也可以正常運行。

那么我們的@Configuration注解是來解決什么問題的勒?

我們來看一下下面這段代碼。當我們在AppConfig中有2個方法,而且第二個方法調(diào)用了第一個方法。

@ComponentScan("com")
public class AppConfig {

	@Bean
	public TestDao testDao() {
		return new TestDao();
	}

	@Bean
	public TestDao1 testDao1() {
		testDao();
		return new TestDao1();
	}
}
public class TestDao1 {
	public TestDao1(){
		System.out.println("testDao1");
	}
}

不加@Configuration的打印結(jié)果

加上@Configuration的打印結(jié)果

二、分析

從表面來看,當我們不加@Configuration注解的時候,我們的TestDao會被實例化兩次,這違背了我們spring默認單例的設(shè)計原則,當加上我們的@Configuration注解的時候,TestDao只被實例化了一次。

那么其底層到底做了什么,讓我們來深追一下spring源碼吧。

當我們解析beanAppcofig的時候,會給它的一個屬性標識為Full,表明它是一個全注解類。

然后在我們調(diào)用ConfigurationClassPostProcessor.postProcessBeanFactory()方法的時候會去判斷我們的bean工廠當中是否有bean需要進行cglib代理。

然后遍歷configBeanDefs這個map

cglib代理主要是對我們的方法進行攔截增強;當我們執(zhí)行AppConfig中的方法的時候會去執(zhí)行cglib代理類中的代理方法,主要就是callBacks中的方法。

isCurrentlyInvokedFactoryMethod(beanMethod)) 

會判斷我們的執(zhí)行方法和我們的調(diào)用方法是否是同一個;如果是同一個就調(diào)用父類的方法進行new;如果不是就調(diào)用$$beanFactory.getBean()獲取。

三、總結(jié)

加上@Configuration注解主要是給我們的類加上了cglib代理。

在執(zhí)行我們的配置類的方法時,會執(zhí)行cglib代理類中的方法,其中有一個非常重要的判斷,當我們的執(zhí)行方法和我們的調(diào)用方法是同一個方法時,會執(zhí)行父類的方法new(cglib代理基于繼承);當執(zhí)行方法和調(diào)用方法不是同一個方法時會調(diào)用beanFactory.getBean獲取。

相關(guān)文章

  • JavaWeb Session失效時間設(shè)置方法

    JavaWeb Session失效時間設(shè)置方法

    這篇文章主要介紹了JavaWeb Session失效時間設(shè)置方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • Spring中容器創(chuàng)建的四種方式示例

    Spring中容器創(chuàng)建的四種方式示例

    這篇文章主要介紹了Spring中容器創(chuàng)建的四種方式示例,Spring容器是Spring框架的核心部分,它負責管理和組織應(yīng)用程序中的對象,它提供了一種輕量級的、非侵入式的方式來實現(xiàn)對象的創(chuàng)建、依賴注入和生命周期管理,需要的朋友可以參考下
    2023-10-10
  • 功能強大的TraceId?搭配?ELK使用詳解

    功能強大的TraceId?搭配?ELK使用詳解

    這篇文章主要為大家介紹了功能強大的TraceId?搭配?ELK使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • java 獲取request中的請求參數(shù)代碼詳解

    java 獲取request中的請求參數(shù)代碼詳解

    這篇文章主要介紹了java 獲取request中的請求參數(shù)的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • Spring中屬性注入詳解

    Spring中屬性注入詳解

    這篇文章主要為大家詳細介紹了Spring中屬性注入,演示了int、String、數(shù)組、list等屬性的注入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java源碼解析HashMap的tableSizeFor函數(shù)

    Java源碼解析HashMap的tableSizeFor函數(shù)

    今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap的tableSizeFor函數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 為何找不到Java 7中的警告

    為何找不到Java 7中的警告

    在本篇文章和里小編給大家整理的是關(guān)于Java 7中的警告的相關(guān)知識點內(nèi)容,有需要的朋友們可以參考下。
    2019-11-11
  • WebSocket實現(xiàn)數(shù)據(jù)庫更新時前端頁面刷新

    WebSocket實現(xiàn)數(shù)據(jù)庫更新時前端頁面刷新

    這篇文章主要為大家詳細介紹了WebSocket實現(xiàn)數(shù)據(jù)庫更新時前端頁面刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • SpringCloud服務(wù)實現(xiàn)同時使用eureka和nacos方法

    SpringCloud服務(wù)實現(xiàn)同時使用eureka和nacos方法

    這篇文章主要介紹了SpringCloud服務(wù)實現(xiàn)同時使用eureka和nacos方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • Java中正則表達式匹配過程實例詳解

    Java中正則表達式匹配過程實例詳解

    正則匹配即是在給定字符串中查找符合正則表達式的字符,下面這篇文章主要給大家介紹了關(guān)于Java中正則表達式匹配過程的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10

最新評論