是否有一种优雅的方法可以创建多个相同类型的bean实例,每个实例都根据枚举值进行参数化?例如:
//MyEnum.java
enum MyEnum
{
VALUE1,
VALUE2;
}
//MyClass.java
class MyClass
{
MyClass(MyEnum myEnum){ ... }
}
//Context.java
@Configuration
class Configuration
{
@Bean
public MyClass myClass1()
{
return new MyClass(MyEnum.VALUE1);
}
@Bean
public MyClass myClass2()
{
return new MyClass(MyEnum.VALUE2);
}
}
有没有比为每个枚举值显式创建新bean更好的方法?请注意,bean的名称并不重要,因为稍后我将使用getBeanNamesForType(MyClass.class)从它们中搜索。
答案 0 :(得分:1)
我讨厌回答我自己的问题。我能够使用DefaultListableBeanFactory实现我想要的功能。
@Bean
public void ApplicationContextAware pseudoFactory()
{
return new ApplicationContextAware()
{
@Override
public void setApplicationContext( ApplicationContext ac )
{
GenericApplicationContext gac = (GenericApplicationContext) ac;
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) gac.getBeanFactory();
for( EnumType enumType : EnumType.values())
{
ParameterizedClass pc = new ParameterizedClass(enumType);
String beanName = enumType.getName() + "ParameterizedClass";
beanFactory.registerSingleton(beanName, pc);
}
}
}
}
答案 1 :(得分:0)
最简单的方法是返回List<MyEnum>
:
@Bean
public List<MyEnum> myEnums() {
return Arrays.asList(MyEnum.values());
}
您无法使用@Autowired
进行注入,但@Resource
只要您按名称进行操作就会有效(Spring Reference中有关此内容的更多信息):
@Resource(name = "myEnums") List<MyEnum> enumValues;
显然,您可以对任何bean列表使用相同的方法。