2013-02-05 68 views
0

是否有一種優雅的方式來創建多個相同類型的bean實例,每個實例都根據枚舉值進行參數化?例如:使用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)從它們中進行搜索。

+0

我只是好奇,有什麼用例需要有春天管理枚舉? – ach

+0

枚舉只是一個細節。我真正想要的是Spring實例化一整個bean家族,每個bean的構建都有一些不同的參數。一種在一個或多個參數軸上的「笛卡爾積」。 – tgoodhart

回答

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); 
     } 
    } 
    } 
} 
0

最簡單的方法是返回一個List<MyEnum>

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

不能使用@Autowired注入,但@Resource(在Spring Reference更多信息這一點),只要你的名字做它的工作原理:

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

你可以明顯地使用這種相同的方法的任何豆類列表。