为了账号安全,请及时绑定邮箱和手机立即绑定

从枚举创建 singelton bean

从枚举创建 singelton bean

慕雪6442864 2023-06-08 17:28:55
我有一个如下所示的枚举public enum MyBeanType {  Type1,  Type2  ...  Type100;}我想为每个枚举值创建一个 Bean。public Class MyBean {  private MyBeanType type; public MyBean(MyBeanType type) { this.type = type; }}我知道我可以像这样在我的配置中列出每一个:@Configurationpublic 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名称连接。
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

编写自定义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]));

    }

  };

}


查看完整回答
反对 回复 2023-06-08
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

您可以简单地以编程方式注册 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));

        }

    }

}


查看完整回答
反对 回复 2023-06-08
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信