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

單例Bean注入多例Bean屬性失效問題的四種解決方案

 更新時(shí)間:2024年05月17日 09:19:47   作者:薛偉同學(xué)  
在實(shí)際的開發(fā)過程中,我們有可能會(huì)遇到這樣一個(gè)場景:多例對象 A 需要作為屬性注入給單例對象 B,但是我們每次獲取 B 的時(shí)候,發(fā)現(xiàn)注入的 A 每次都是同一個(gè),并不是多例的,所以本文給大家介紹了如何解決單例Bean注入多例Bean屬性失效問題,需要的朋友可以參考下

問題描述

在實(shí)際的開發(fā)過程中,我們有可能會(huì)遇到這樣一個(gè)場景:多例對象 A 需要作為屬性注入給單例對象 B,但是我們每次獲取 B 的時(shí)候,發(fā)現(xiàn)注入的 A 每次都是同一個(gè),并不是多例的。也就是下面這個(gè)代碼:

@Component
@Scope("prototype")
public class A {
}

@Component
public class B {

    @Autowired
    private A a;

    @Override
    public String toString() {
        return "B{" +
                "a=" + a +
                '}';
    }
}
@Test
public void test1() {
    B b1 = context.getBean("b", B.class);
    B b2 = context.getBean("b", B.class);
    System.out.println(b1);
    System.out.println(b2);
}

輸入內(nèi)容如下:

從結(jié)果可以看出,B 注入的 A 是同一個(gè)對象,而不是期望的多例對象。

問題原因

基于前文的內(nèi)容:《Bean的創(chuàng)建過程超詳細(xì)解析》,Spring 在第一次創(chuàng)建單例對象 B 的時(shí)候,會(huì)進(jìn)行屬性的填充,此時(shí)會(huì)調(diào)用工廠獲取 A 的多例對象。創(chuàng)建好 B 之后就將 B 緩存起來,下次獲取直接從緩存中獲取 B,拿到后直接返回,不會(huì)再次去工廠中獲取 A 對象了,所以這就是作用域失效的根本原因。

問題解決

要想解決此問題,我們需要延遲獲取多例對象。這里提供四種方案可供參考:

方案一:作用域指定代理

@Component
@Scope(value = "prototype" , proxyMode = ScopedProxyMode.TARGET_CLASS)
public class A {
}

@Component
public class B {

    @Autowired
    private A a;

    @Override
    public String toString() {
        return "B{" +
                "a=" + a +
                '}';
    }
}

這樣表示每次獲取 A 都是獲取的代理的對象,只要在代理上調(diào)用方法,每次獲取都會(huì)根據(jù)作用域重新獲取。

方案二:指定懶加載

@Component
@Scope("prototype")
public class A {
}

@Component
public class B {

    @Lazy
    @Autowired
    private A a;

    @Override
    public String toString() {
        return "B{" +
                "a=" + a +
                '}';
    }
}

使用懶加載一樣會(huì)創(chuàng)建代理的對象,只要在代理上調(diào)用方法,每次獲取都會(huì)根據(jù)作用域重新獲取。

方案三:使用對象工廠 ObjectFactory

@Component
@Scope("prototype")
public class A {
}

@Component
public class B {

    @Autowired
    private ObjectFactory<A> a;

    @Override
    public String toString() {
        return "B{" +
                "a=" + a.getObject() +
                '}';
    }
}

方案四:從容器獲取

@Component
@Scope("prototype")
public class A {
}

@Component
public class B {

    @Autowired
    private ApplicationContext context;

    @Override
    public String toString() {
        return "B{" +
                "a=" + context.getBean("a") +
                '}';
    }
}
@Component
@Scope("prototype")
public class A {
}

@Component
public class B implements BeanFactoryAware {

    private BeanFactory beanFactory;

    @Override
    public String toString() {
        return "B{" +
                "a=" + beanFactory.getBean("a") +
                '}';
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
}

以上就是單例Bean注入多例Bean屬性失效問題的四種解決方案的詳細(xì)內(nèi)容,更多關(guān)于單例Bean注入多例失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java常見異常及處理方式總結(jié)

    Java常見異常及處理方式總結(jié)

    今天給大家?guī)淼氖荍ava的相關(guān)知識(shí),文章圍繞著Java異常展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 學(xué)生視角手把手帶你寫Java?線程池改良版

    學(xué)生視角手把手帶你寫Java?線程池改良版

    作者是一個(gè)來自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請指正,將來會(huì)不斷的完善筆記,幫助更多的Java愛好者入門
    2022-03-03
  • SpringBoot通過tractId操作日志鏈路跟蹤

    SpringBoot通過tractId操作日志鏈路跟蹤

    這篇文章給大家介紹SpringBoot通過tractId操作日志鏈路跟蹤,通過tractId,即可完成對從一個(gè)請求進(jìn)入系統(tǒng)到請求結(jié)束的日志追蹤,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • 使用IDEA向Gitee提交SpringBoot項(xiàng)目進(jìn)行遠(yuǎn)程管理

    使用IDEA向Gitee提交SpringBoot項(xiàng)目進(jìn)行遠(yuǎn)程管理

    本文主要介紹了使用IDEA向Gitee提交SpringBoot項(xiàng)目進(jìn)行遠(yuǎn)程管理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java使用Memcached簡單教程

    java使用Memcached簡單教程

    本文主要記錄Memcached的一些基本使用和簡單的Monitor,大家參考使用吧
    2013-12-12
  • java實(shí)現(xiàn)Dijkstra算法

    java實(shí)現(xiàn)Dijkstra算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Dijkstra算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 使用java文件過濾器輸出制定格式文件路徑的實(shí)例代碼

    使用java文件過濾器輸出制定格式文件路徑的實(shí)例代碼

    這篇文章主要介紹了使用java文件過濾器輸出制定格式文件路徑的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java零基礎(chǔ)講解異常

    Java零基礎(chǔ)講解異常

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會(huì)根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機(jī)制是我們java語言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序出現(xiàn)的錯(cuò)誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-04-04
  • 動(dòng)態(tài)修改spring?aop?切面信息提升自動(dòng)日志輸出框架效率

    動(dòng)態(tài)修改spring?aop?切面信息提升自動(dòng)日志輸出框架效率

    這篇文章主要為大家介紹了動(dòng)態(tài)修改spring?aop切面信息提升自動(dòng)日志輸出框架效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Spring Boot數(shù)據(jù)庫鏈接池配置方法

    Spring Boot數(shù)據(jù)庫鏈接池配置方法

    這篇文章主要介紹了Spring Boot數(shù)據(jù)庫鏈接池配置方法,需要的朋友可以參考下
    2017-04-04

最新評(píng)論