0

有没有一种优雅的方法来创建多个相同类型的 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) 从它们中进行搜索。

4

2 回答 2

1

我讨厌回答我自己的问题。我能够使用 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);
      }
    }
  };
}
于 2013-02-19T19:00:03.413 回答
0

最简单的方法是返回一个List<MyEnum>

@Bean
public List<MyEnum> myEnums() {
    return Arrays.asList(MyEnum.values());
}    

您不能使用@Autowired注入,但@Resource只要您按名称执行它就可以工作(在Spring Reference中有更多信息):

@Resource(name = "myEnums") List<MyEnum> enumValues;    

您显然可以对任何 bean 列表使用相同的方法。

于 2013-02-06T17:14:27.283 回答