【问题标题】:Inject dependencies into enum with guice(or Spring)使用 guice(或 Spring)将依赖项注入枚举
【发布时间】:2015-05-13 03:46:25
【问题描述】:

我正在将一个 servlet 应用程序与 Guice 集成(可能是 Spring,我选择 Guice 只是因为我使用它)。而且这个应用程序广泛使用特定于常量的方法(数千个枚举)。从服务中,它确定要调用的操作:

ActionEnum act = ActionEnum.valueof("Action from context");
act.perform();

枚举操作如下所示:

public enum ActionEnum {
    ACTION1 { perform() {}},
    ACTION2 { perform() {}};
    abstract void perform();
}

有没有办法通过 Guice(或 Spring)向枚举类注入一些东西?例如:

public enum ActionEnum {
    ACTION1 {
       @Inject
       SomeClass case1ToBeUsedByAction1;

       void perform() { 
            case1ToBeUsedByAction1.doSomething();
            case2ToBeUsedByActionN.doSomething();
       }
    },
    ACTION2 { void perform() { case2ToBeUsedByActionN.doSomething(); }};
    abstract void perform();
    @Inject SomeClass case2ToBeUsedByActionN;
}

或者如何更改当前代码库以启用注入?

【问题讨论】:

  • 我认为你不能注入enum。没有实例可供您注入... 将其更改为 class?
  • 枚举原则上是静态的、全局的、对象。它似乎不适合注射。
  • 您可以使用Injector.injectMembers()AbstractModule.requestInjection() 来执行此操作。但这似乎不是一个好的设计。

标签: java spring enums guice


【解决方案1】:

您可以像这样将类添加为枚举值:

public enum TestType {

TEST_TYPE_1("TEST-1", Test1.class), 
TEST_TYPE_2("TEST-2", Test2.class), 
TEST_TYPE_3("TEST-3", Test3.class), 
TEST_TYPE_4("TEST-4", Test4.class), 
TEST_TYPE_5("TEST-5", Test5.class);

private final String testType;
private final Class<? extends TestIF> tester;

private <T extends TestIF> TestType(String testType, Class<? extends TestIF> tester)    {       
    this.testType = testType;
    this.tester = (Class<tester.TestIF>) tester;
}

public String toString() {
    return this.testType;
}

public Class<? extends TestIF> tester() {
    return this.tester;
}

然后为每个类实现TestIF并像这样执行注入的类:

TestIF tester = Guice.createInjector().getInstance(testType.tester());    
tester.perform();

【讨论】:

    【解决方案2】:

    Java enum 的实例是在编译时创建的。而 guice 的实例创建和管理是在运行时动态执行的。

    请注意,enum 类型不能有公共构造函数,这巩固了在运行时动态创建 enum 类型实例是不可能的事实。

    或者如何更改当前代码库以启用注入?

    -- 除了使用常规的class 类型之外,您无能为力。 Guice 无法对您的枚举类进行注入,因为在运行时可能已经创建了 enum 类型实例。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多