从枚举创建单例 bean
Create singelton beans from enum
我有一个如下所示的枚举
public enum MyBeanType {
Type1,
Type2
...
Type100;
}
我想为每个枚举值创建一个 Bean。
public Class MyBean {
private MyBeanType type;
public MyBean(MyBeanType type) { this.type = type; }
}
我知道我可以像这样在我的配置中列出每一个:
@Configuration
public class MyBeanConfig() {
@Bean public MyBean myBeanType1() { return new MyBean(MyBeanType.Type1);
@Bean public MyBean myBeanType2() { return new MyBean(MyBeanType.Type2);
...
@Bean public MyBean myBeanType100() { return new MyBean(MyBeanType.Type100);
}
但是有没有办法更动态地做到这一点?
我通常将所有这些连接为 List
,但在某些情况下我也想通过名称连接 myBeanType2
。
您可以简单地以编程方式注册 bean。像这样的东西应该可以做到。
@Configuration
public class MyBeanConfig() implements ApplicationContextAware {
@Override
public void setApplicationContext(final ApplicationContext ctx) {
final ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) ctx).getBeanFactory();
for(final MyBeanType beanType: MyBeanType.values()) {
beanFactory.registerSingleton(MyBean.class.getCanonicalName() + "_" + beanType, new MyBean(beanType));
}
}
}
编写一个自定义 BeanFactoryPostProcessor
来使用 bean 定义。
@Bean
public BeanFactoryPostProcessor getBeanFactoryPostProcessor() {
return beanFactory -> {
for (int i = 0; i < MyBeanType.values().length; i++) {
beanFactory.registerSingleton(MyBeanType.class.getSimpleName() + i,
new MyBean(MyBeanType.values()[i]));
}
};
}
我有一个如下所示的枚举
public enum MyBeanType {
Type1,
Type2
...
Type100;
}
我想为每个枚举值创建一个 Bean。
public Class MyBean {
private MyBeanType type;
public MyBean(MyBeanType type) { this.type = type; }
}
我知道我可以像这样在我的配置中列出每一个:
@Configuration
public class MyBeanConfig() {
@Bean public MyBean myBeanType1() { return new MyBean(MyBeanType.Type1);
@Bean public MyBean myBeanType2() { return new MyBean(MyBeanType.Type2);
...
@Bean public MyBean myBeanType100() { return new MyBean(MyBeanType.Type100);
}
但是有没有办法更动态地做到这一点?
我通常将所有这些连接为 List
,但在某些情况下我也想通过名称连接 myBeanType2
。
您可以简单地以编程方式注册 bean。像这样的东西应该可以做到。
@Configuration
public class MyBeanConfig() implements ApplicationContextAware {
@Override
public void setApplicationContext(final ApplicationContext ctx) {
final ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) ctx).getBeanFactory();
for(final MyBeanType beanType: MyBeanType.values()) {
beanFactory.registerSingleton(MyBean.class.getCanonicalName() + "_" + beanType, new MyBean(beanType));
}
}
}
编写一个自定义 BeanFactoryPostProcessor
来使用 bean 定义。
@Bean
public BeanFactoryPostProcessor getBeanFactoryPostProcessor() {
return beanFactory -> {
for (int i = 0; i < MyBeanType.values().length; i++) {
beanFactory.registerSingleton(MyBeanType.class.getSimpleName() + i,
new MyBean(MyBeanType.values()[i]));
}
};
}