我有以下代码:
public IFoo getFoo(Type type) // Type is an enum containing A, B etc.
{
switch(type)
{
case A: return new Foo1(); // implements IFoo
case B: return new Foo2(); // implements IFoo
etc.
}
}
这显然违反了OCP,所以我需要重构;另外我现在需要返回由Spring容器管理的原型bean。为此,我可以考虑以下选项:
1)使这个类AppContextAware;创建一个地图< Type,String>其中String是bean id;在Spring Config中将这些bean定义为原型,并在Spring配置中定义此Map并将其注入此类,然后从该映射获取给定枚举的bean id并使用它从AppContext获取bean,
2)类似的方法,但是对于Map中的值,使用一个TargetSource,它有一个我在getTarget()
中调用的抽象方法,并且我使用lookup-method
连接定义的原型bean作为这个抽象方法TargetSource定义,
3)类似的方法,但我使用FactoryBean而不是TargetSource。
在#1中,我的课程取决于AppContext,而其他方法则不然。所以我倾向于#2或#3,但要选择哪一个?或者还有其他更好的方法,我没有想过?
答案 0 :(得分:1)
无论如何我最终使用#1,因为它是最简单的,并创建了更少数量的bean。
答案 1 :(得分:0)
看一下FactoryBean,可能就是你要找的东西。请查看here示例。
击 向上>