3

我有一个关于依赖注入的问题。

我有一堂课,说:

class MyClass {
    MyServiceAPI serviceAPI;
    public setSession(Session session) {
         serviceAPI = new MyServiceAPI(session);     
    }
    ....
}

会话由另一个类创建,该类在运行时从数据库中加载它。

class MyAnotherClass {
    Myclass myClass;

    @Inject
    MyAnotherClass(MyClass myClass) {
        this.myClass = myClass;
    }

    public someFunction() {
        String key = <read from database>;
        Session session = new Session(key);
        myClass.setSession();
        ......
    }
}

如前所述,MyClass 实例被注入到 MyAnotherClass 中,而 MyClass 中的 serviceAPI 实例是使用 new 创建的。如果我想将 ServiceAPI 注入 MyClass,我可以在创建会话的类中创建它,并使用 setter 将其设置为 MyClass。

但问题是我真的不想让 MyAnotherClass 创建 MyServiceAPI 并将其注入 MyClass。我希望 MyAnotherClass 不知道 MyServiceAPI 的存在。

有没有办法可以使用像 Guice 或 Spring 这样的依赖注入器来做到这一点?或者只是Java?

非常感谢。

4

4 回答 4

1

使用guice和简单工厂的可能解决方案。MyServiceAPI 可以是一个接口。

public class MyClass {

    @Inject
    private MyServiceFactory factory;
    private MyServiceAPI myServiceAPI;

    public void setSession(Session session) {
        myServiceAPI = factory.createMyServiceAPI(session);
    }
}

public class MyServiceFactory {

    MyServiceAPI createMyServiceAPI(Session session) {
        // create with new, inject via Injector, do what you want... :)
        return <yourobject>;
    }
}
于 2012-04-18T19:43:30.573 回答
1

如果您希望在纯 Java 中进行依赖注入,那么从 Java 6 开始,可以通过内置的 Java 服务提供者接口提供一些支持。虽然它需要一些与 jar 文件等相关的管道。在这里查看 Java SPI

于 2012-04-18T19:18:56.630 回答
0

你只需要为此使用一个好的老式工厂。

class MyAnotherClass {
    MyClassFactory myClassFactory;

    @Inject
    MyAnotherClass( MyClassFactory myClassFactory ) {
        this.myClassFactory = myClassFactory;
    }

    public void someFunction() {
        String key = "1"; // read from DB
        myClass = myClassFactory.getMyClass( key );
    }
}

class MyClassFactory {
    public MyClass getMyClass( String key ) {
        Session session = new Session( key );
        MyClass myClass = new MyClass();
        myClass.setSession( session );
        return myClass;
    }
}
于 2012-04-18T19:52:25.290 回答
0

我确实认为您可能必须重新排序您的依赖项。同样,在不知道您的完整代码的情况下,这有点困难,但是看看您的示例,以下内容似乎是正确的:

  • MyClass实际上取决于MyServiceAPI而不是Session。因此,您应该MyServiceAPI直接在其构造函数中注入 a 。

  • Session应该将其sessionId(或其他)注入其构造函数中。你可以在 Guice 中绑定它的值,所以你会得到类似的东西:@Inject @SessionId public Session(String sessionId)。或者你可以同时注入sessionId和 some ,这样它就可以从服务中检索自己的数据。SessionServiceSession

  • MyServiceAPI应该Session注入其中。

于 2012-04-18T19:53:10.070 回答