天天看點

Spring中單例bean注入多例bean的解決方法1、問題描述2、問題分析3、解決方法4、原理分析

1、問題描述

在項目代碼的使用過程,單例對象A中需要注入對象B。B對象要求是多例的。我們在對象B上添加注解“@Scope(“prototype”)”,代碼運作過程中,發現A中注入的B對象始終是同一個,并沒有實作多例的效果。

下面展示一些

内聯代碼片

@Componment
public class A {
@Autowired
private  B b
}
           

下面展示一些

内聯代碼片

@Componment
@Scope("prototype")
public class B {
	....
}
           

2、問題分析

在BeanA初始化的時候,會注入Bean B;由于A是單例的,隻初始化一次,此時A中B引用的Bean B就會一直是初始化時注入的bean.

3、解決方法

Bean B上添加如下注解

@Componment
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)  
public class B {
	....
}
           

4、原理分析

這将導緻建立代理。該代理建立一次,并将在每次調用 getBean 時傳回。隻要在代理上調用方法,它就會根據範圍建立新方法或重用現有方法。由于您已将範圍指定為 prototype ,是以每個方法調用都将生成一個新對象。