Java 使用Spring注释为每个枚举值创建一个bean
是否有一种优雅的方法来创建相同类型的多个bean实例,每个实例都根据一个枚举值进行参数化?例如:Java 使用Spring注释为每个枚举值创建一个bean,java,spring,Java,Spring,是否有一种优雅的方法来创建相同类型的多个bean实例,每个实例都根据一个枚举值进行参数化?例如: //MyEnum.java enum MyEnum { VALUE1, VALUE2; } //MyClass.java class MyClass { MyClass(MyEnum myEnum){ ... } } //Context.java @Configuration class Configuration { @Bean public MyClass myClass1(
//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)从它们中进行搜索。最简单的方法是返回一个
列表:
显然,您可以对任何bean列表使用相同的方法。我讨厌回答我自己的问题。我能够使用DefaultListableBeanFactory实现我想要的
@Bean
public 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);
}
}
};
}
我只是好奇,需要Spring管理枚举的用例是什么?枚举只是一个细节。我真正想要的是Spring实例化一个完整的bean家族,每个bean都用一组稍微不同的参数构建。一种在一个或多个参数轴上的“笛卡尔积”。
@Resource(name = "myEnums") List<MyEnum> enumValues;
@Bean
public 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);
}
}
};
}