有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Spring注释为每个枚举值创建一个bean

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


共 (2) 个答案

  1. # 1 楼答案

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

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

    您不能使用@Autowired进行注入,但是@Resource只要您按名称注入即可工作(有关这方面的更多信息,请参阅Spring Reference):

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

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

  2. # 2 楼答案

    我讨厌回答我自己的问题。我能够使用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);
          }
        }
      };
    }