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 ,是以每個方法調用都将生成一個新對象。