使用Spring注释为每个枚举值创建一个bean

时间:2013-02-05 19:06:49

标签: 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()
  {
    return new MyClass(MyEnum.VALUE1);
  }

  @Bean
  public MyClass myClass2()
  {
    return new MyClass(MyEnum.VALUE2);
  }
}

有没有比为每个枚举值显式创建新bean更好的方法?请注意,bean的名称并不重要,因为稍后我将使用getBeanNamesForType(MyClass.class)从它们中搜索。

2 个答案:

答案 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列表使用相同的方法。