最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

問題描述

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

@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 是同一個對象,而不是期望的多例對象。

問題原因

基于前文的內(nèi)容:《Bean的創(chuàng)建過程超詳細(xì)解析》,Spring 在第一次創(chuàng)建單例對象 B 的時候,會進(jìn)行屬性的填充,此時會調(diào)用工廠獲取 A 的多例對象。創(chuàng)建好 B 之后就將 B 緩存起來,下次獲取直接從緩存中獲取 B,拿到后直接返回,不會再次去工廠中獲取 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)用方法,每次獲取都會根據(jù)作用域重新獲取。

方案二:指定懶加載

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

@Component
public class B {

    @Lazy
    @Autowired
    private A a;

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

使用懶加載一樣會創(chuàng)建代理的對象,只要在代理上調(diào)用方法,每次獲取都會根據(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中的RabbitMQ使用場景和實(shí)踐方法

    Java中的RabbitMQ使用場景和實(shí)踐方法

    本文我們介紹RabbitMQ在Java應(yīng)用中的使用,從基礎(chǔ)概念到高級特性,從簡單的點(diǎn)對點(diǎn)通信到復(fù)雜的事件驅(qū)動架構(gòu),RabbitMQ都能提供強(qiáng)大的支持,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • springboot 配置日志 打印不出來sql的解決方法

    springboot 配置日志 打印不出來sql的解決方法

    這篇文章主要介紹了springboot 配置日志 打印不出來sql的解決方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • spring cloud學(xué)習(xí)入門之config配置教程

    spring cloud學(xué)習(xí)入門之config配置教程

    這篇文章主要給大家介紹了關(guān)于spring cloud學(xué)習(xí)入門之config配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring cloud具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 基于java Springboot實(shí)現(xiàn)教務(wù)管理系統(tǒng)詳解

    基于java Springboot實(shí)現(xiàn)教務(wù)管理系統(tǒng)詳解

    這篇文章主要介紹了Java 實(shí)現(xiàn)簡易教務(wù)管理系統(tǒng)的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 關(guān)于idea引入spring boot <parent></parent>父依賴標(biāo)紅問題

    關(guān)于idea引入spring boot <parent></parent>父依賴標(biāo)紅問題

    這篇文章主要介紹了idea引入spring boot <parent></parent>父依賴標(biāo)紅問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java關(guān)于JDK1.8新特性的Stream流

    Java關(guān)于JDK1.8新特性的Stream流

    這篇文章主要介紹了版本薇JDK1.8 的Java中的Stream流,Stream流是一個來自數(shù)據(jù)源的元素隊(duì)列并支持聚合操作,感興趣的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • Java前端Layer.open.btn驗(yàn)證無效解決方法

    Java前端Layer.open.btn驗(yàn)證無效解決方法

    在本篇文章里我們給大家整理了一篇關(guān)于Java前端Layer.open.btn驗(yàn)證無效解決方法以及實(shí)例代碼,需要的朋友們可以參考學(xué)習(xí)下。
    2019-09-09
  • Java實(shí)現(xiàn)在線語音識別

    Java實(shí)現(xiàn)在線語音識別

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)在線語音識別功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java中的鍵盤事件處理及監(jiān)聽機(jī)制解析

    Java中的鍵盤事件處理及監(jiān)聽機(jī)制解析

    這篇文章主要介紹了Java中的鍵盤事件處理及監(jiān)聽機(jī)制解析,Java事件處理采用了委派事件模型,在這個模型中,當(dāng)事件發(fā)生時,產(chǎn)生事件的對象將事件信息傳遞給事件的監(jiān)聽者進(jìn)行處理,在Java中,事件源是產(chǎn)生事件的對象,比如窗口、按鈕等,需要的朋友可以參考下
    2023-10-10
  • JDK內(nèi)置工具之常用工具和實(shí)戰(zhàn)指令詳解

    JDK內(nèi)置工具之常用工具和實(shí)戰(zhàn)指令詳解

    jdk提供了很多強(qiáng)大的工具有命令行也有可視化的,這篇文章主要介紹了JDK內(nèi)置工具之常用工具和實(shí)戰(zhàn)指令的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08

最新評論

墨竹工卡县| 股票| 临邑县| 新乡县| 西吉县| 永城市| 镇沅| 浦东新区| 托里县| 张家港市| 留坝县| 永吉县| 湘潭县| 若羌县| 如皋市| 神农架林区| 松桃| 阿坝县| 屏东县| 朝阳市| 黄冈市| 镇原县| 琼中| 集贤县| 常熟市| 中超| 通山县| 和龙市| 新建县| 延川县| 华阴市| 通海县| 勐海县| 沐川县| 桂林市| 延津县| 花莲市| 灵璧县| 常熟市| 永川市| 色达县|