使用guice(或Spring)将依赖项注入枚举

问题描述 投票:1回答:2

我正在将一个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;
}

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

java spring enums guice
2个回答
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();

0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.