枚举动态返回春豆

时间:2017-12-04 20:55:03

标签: java spring

枚举是否可以为不同的值返回不同的spring bean?

如果可能,我们可以创建一个包含不同值的枚举,并且我们可以为不同的值返回不同类型的spring组件。

我想实现这样的目标:

public enum MyFactory {
    BEAN1 {
        @Autowired
        Bean1 bean1;

       @Override
       public MyBean getMyBean() {
           return bean1;
       }
    },
    BEAN2 {
        @Autowired
        Bean1 bean2;

       @Override
       public MyBean getMyBean() {
           return bean2;
       }
    };

    public abstract MyBean getMyBean();
}

谢谢,

2 个答案:

答案 0 :(得分:0)

Java枚举被设计为常量值 但要实现您的要求,您应该在创建后设置枚举状态,或者将ApplicationContext作为参数传递给枚举方法或枚举方法初始化。

它击败了枚举目的:恒定值。

我认为定义一个bean类更有意义,它提供一次定义的bean而无法改变它们。

@Component
public class MyEnumClass{

   @Autowired
   private Value valueA;

   @Autowired
   private Value valueB;

   public Value getValueA(){
       return valueA;
   }

   public Value getValueB(){
       return valueB;
   }
   ...

}

Value类优选不可变。

答案 1 :(得分:0)

不要使用枚举来有条件地注射。

Spring本身就能做到这一点。

这与依赖注入的整体好处有些相反;只要您的组件在它们之间定义公共接口,您就可以随意注入任何一个,而无需(自我管理)条件。

假设您有组件AComponentBComponent。它们是相关的,并且共享一个足够通用的接口,将它编码为接口是有意义的。然后,您可以定义它。

public interface Component {
    Integer generateValue(String foo, List<Integer> bar);
}


public class AComponent implements Component {}
public class BComponent implements Component {}

然后,您可以随意注入:

private Component component;

@Autowired
public MyService(@Qualifier("bComponent") Component component) {
    this.component = component;
}

Spring完全有能力为您管理动态布线。

或者,如果这些组件完全 un 彼此相关,那么您无论如何都必须单独连接它们,而不是根据您的需要动态选择它们。