2012-11-05 26 views
4

我必須根據動態構造函數值創建需要緩存的bean。示例:我需要一個OrganizationResource bean,其中「x」(構造函數值)組織將具有其自己的特定實例值,「y」(構造函數值)將具有不同的值。 但我不想爲每個x值創建一個新對象,我希望它被緩存。基於動態構造函數值的Spring bean範圍

我知道有2個範圍,單身人士和原型,動態構造函數值。我打算使用原型,但似乎每次都會創建一個新對象,我如何在spring中基於構造函數值實現緩存?

+5

聽起來像你應該考慮一個工廠模式在這裏? –

+0

感謝您的回覆,春天沒有提供任何其他方式嗎? –

+0

1.我不認爲創建額外的對象會對性能產生任何明顯的影響 - GC對於收集年輕對象非常優化。 2.我不確定IoC容器是不是創建業務對象的好地方 - 尤其是實體,這些實體可能通過兼容JPA的框架進行更好的管理。 –

回答

2

FactoryBean是一種方式。這很簡單,試試吧。所有你需要做的就是創建一個類實現FactoryBean和bean定義文件中引用它:現在

package some.package; 
import org.springframework.beans.factory.FactoryBean; 

public class ExampleFactory implements FactoryBean { 

private String type; 

public Object getObject() throws Exception { 
    //Logic to return beans based on 'type' 
} 

public Class getObjectType() { 
    return YourBaseType.class; 
} 

public boolean isSingleton() { 
    //set false to make sure Spring will not cache instances for you. 
    return false; 
} 

public void setType(final String type) { 
    this.type = type; 
}} 

,在bean定義文件,提出:

<bean id="cached1" class="some.package.ExampleFactory"> 
    <property name="type" value="X" /> 
</bean> 

<bean id="cached2" class="some.package.ExampleFactory"> 
    <property name="type" value="Y" /> 
</bean> 

它將基於策略使物體你在ExampleFactory.getObject()執行。