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 を明示的に作成するよりも良い方法はありますか? 後で getBeanNamesForType(MyClass.class) を使用して Bean から検索するので、Bean の名前は重要ではないことに注意してください。

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 に答える