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

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

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

問題描述

在實際的開發(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);
}

輸入內容如下:

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

問題原因

基于前文的內容:《Bean的創(chuàng)建過程超詳細解析》,Spring 在第一次創(chuàng)建單例對象 B 的時候,會進行屬性的填充,此時會調用工廠獲取 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 都是獲取的代理的對象,只要在代理上調用方法,每次獲取都會根據(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)建代理的對象,只要在代理上調用方法,每次獲取都會根據(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屬性失效問題的四種解決方案的詳細內容,更多關于單例Bean注入多例失效的資料請關注腳本之家其它相關文章!

相關文章

  • Java中的RabbitMQ使用場景和實踐方法

    Java中的RabbitMQ使用場景和實踐方法

    本文我們介紹RabbitMQ在Java應用中的使用,從基礎概念到高級特性,從簡單的點對點通信到復雜的事件驅動架構,RabbitMQ都能提供強大的支持,結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • springboot 配置日志 打印不出來sql的解決方法

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

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

    spring cloud學習入門之config配置教程

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

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

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

    關于idea引入spring boot <parent></parent>父依賴標紅問題

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

    Java關于JDK1.8新特性的Stream流

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

    Java前端Layer.open.btn驗證無效解決方法

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

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

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

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

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

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

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

最新評論

京山县| 松潘县| 普洱| 久治县| 工布江达县| 遂平县| 温泉县| 青州市| 高雄县| 顺昌县| 枣强县| 富裕县| 桐城市| 庆安县| 十堰市| 怀宁县| 柞水县| 盐亭县| 根河市| 特克斯县| 毕节市| 扶风县| 文安县| 扶余县| 延庆县| 五河县| 河西区| 屯昌县| 东源县| 吉林市| 沙田区| 武平县| 中阳县| 钟祥市| 乌审旗| 宁晋县| 扬中市| 巴塘县| 宿迁市| 内黄县| 儋州市|