在單例Bean中依賴原型Bean問題解決

2021-10-13 15:37:40 字數 3112 閱讀 6589

第一步:建立乙個單例bean。

package com.***.tech.scope;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.beans.factory.config.configurablebeanfactory;

import org.springframework.context.annotation.scope;

/***

* 定義乙個單例bean,依賴原型bean

* @author 君戰

* **/

@scope

(configurablebeanfactory.scope_singleton)

public

class

singletonbean

}

第二步:建立乙個原型bean。

package com.***.tech.scope;

import org.springframework.beans.factory.config.configurablebeanfactory;

import org.springframework.context.annotation.scope;

/***

* 定義乙個原型bean,被單例bean依賴

* @author 君戰

* **/

@scope

(configurablebeanfactory.scope_prototype)

public

class

prototypebean

第三步:編寫啟動類,用來測試。

package com.***.tech.scope;

/***

* 演示單例bean依賴原型bean 問題

* @author 君戰

* **/

public

class

singletondependencyprototypebeandemo

}

第四步:執行啟動類main方法,檢視控制台。

原型bean hashcode為:1218593486

原型bean hashcode為:1218593486

process finished with exit code 0

可以看到原型bean上的@scope註解彷彿失去了效果,在單例bean每次呼叫display方法列印的原型bean的hashcode都是一致的。

這種現象雖然在意料之外,但是在情理之中。因為原型bean只會被例項化、初始化一次,因此其依賴也只會被處理一次,所以被注入的原型bean也隱式的成為了單例bean。那麼如何解決這個問題呢?有兩種方法,一種是依賴查詢,另一種是使用抽象方法來解決(官方推薦),接下來就**分別演示下這兩種方式。

依賴查詢解決單例bean中依賴原型bean問題

package com.***.tech.scope;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.beans.factory.config.configurablebeanfactory;

import org.springframework.context.annotation.scope;

/***

* 定義乙個單例bean,依賴原型bean

* @author 君戰

* **/

@scope

(configurablebeanfactory.scope_singleton)

public

class

singletonbean

}

抽象方法解決單例bean中依賴原型bean問題(官方推薦)

首先給出官方文件位址,在官方文件是也有demo。抽象方法解決單例bean中依賴原型bean問題

將singletonbean宣告為抽象類,定義乙個抽象方法,方法名是什麼無所謂,只需要將該方法的返回值宣告為prototypebean即可。

package com.***.tech.scope;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.beans.factory.annotation.lookup;

import org.springframework.beans.factory.config.configurablebeanfactory;

import org.springframework.context.annotation.scope;

/***

* 定義乙個單例bean,依賴原型bean

* @author 君戰

* **/

@scope

(configurablebeanfactory.scope_singleton)

public

abstract

class

singletonbean

}

再次執行啟動類的main方法,檢視控制台,可以發現可以做到和依賴查詢一樣的效果。

原型bean hashcode為:1763344271

原型bean hashcode為:1353170030

process finished with exit code 0

官方文件-1.4.6小節。在單例bean中依賴原型bean時,由於單例bean只會被ioc容器初始化一次,其依賴也只會被處理一次,因此其依賴的原型bean也「隱式」的稱為單例。

如何解決這個問題,有兩種辦法,一種是在使用原型bean時每次都依賴查詢,這樣ioc容器會每次都重新建立原型bean;另一種辦法就是使用@lookup註解來解決,這種是官方給出解決方案,需注意的是使用@lookup註解的方法必須宣告為抽象方法。

單例bean需要依賴原型Bean的問題

乙個單例的bean a需要依賴原型bean b,由於a是單例的而引起a中引用的b也出現單例的現象。解決方法在spring官網中給出 component scope configurablebeanfactory.scope singleton public void pringb override ...

spring依賴注入bean 預設是單例模式

spring提供了5種scope分別是singleton prototype request session global session。單例bean與原型bean的區別 單例bean的優勢 由於不會每次都新建立新物件所以有一下幾個效能上的優勢 單例bean的劣勢 單例的bean乙個很大的劣勢就是...

Spring中Bean的單例和多例

在spring中,bean可以被定義為兩種模式 prototype 多例 和singleton 單例 singleton 單例 只有乙個共享的例項存在,所有對這個bean的請求都會返回這個唯一的例項。prototype 多例 對這個bean的每次請求都會建立乙個新的bean例項,類似於new。spr...