【问题标题】:How to inject parameters in enum constructor using Spring?如何使用 Spring 在枚举构造函数中注入参数?
【发布时间】:2013-08-09 15:16:22
【问题描述】:

我有一个这样的枚举:

public enum SomeEnum {
    ONE (new MyClass()),
    TWO (new MyClass());

    private final MyClass instance;

    private SomeEnum(MyClass instance) {
        this.instance = instance;
    }
}

如何将 MyClass 实例从 Spring 上下文传递给枚举构造函数?有没有可能?

我需要它,因为我在创建它时将一些参数从配置(.properties 文件)传递到 MyClass 实例。现在我用 bean 在 xml-file 中做,也许还有另一种方法?

【问题讨论】:

  • 我认为您可以改为将 MyClass 实例声明为容器中的 bean 并将 SomeEnum 转换为 qualifier。一般来说,将 Java 单例与 Spring 单例 bean 混合并不是一个好主意。

标签: java spring enums


【解决方案1】:

你不能这样做。

在枚举类型的 official Java tutorial 中,它声明

注意:枚举类型的构造函数必须是包私有或 私人访问。它会自动创建常量 在枚举主体的开头定义。您不能调用枚举 自己构造。

由于 Enum 应该是一组常量,因此无法创建新的,因此构造函数不可用,即使通过反射也是如此。

【讨论】:

    【解决方案2】:

    即使我们在 Spring 的上下文中讨论,我认为这也是不可能的。

    您不能实例化枚举,因为它们具有静态特性。所以我认为 Spring IoC 也不能创建枚举。

    请看Spring IoC章节。

    【讨论】:

      【解决方案3】:

      但是,您可以做的是利用枚举中的 MyClass 来封装一些“恒定”行为。您可以随心所欲地使用它(这不一定是个好主意...)例如,您可以使用一些静态工厂类来加载基于那些传入的常量名。

      public enum SomeEnum {
          ONE ("propname1"),
          TWO ("propname2");
      
          private final MyClass instance;
      
          private SomeEnum(String str) {
              this.instance = MyClassFactory.newInstance(str);
          }
      
          public Object doSomething(int value) {
              return instance.doSomething(value);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多