我可以注入动态创建的对象吗?

时间:2012-04-18 19:03:21

标签: java spring dependency-injection guice

我对依赖注入有疑问。

我有一节课,说:

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这样的depdendency injecter来做到这一点?或者只是Java?

非常感谢。

4 个答案:

答案 0 :(得分:1)

如果您希望在纯Java中进行依赖注入,那么通过内置的Java服务提供程序接口可以获得Java 6的一些支持。虽然它需要一些带有jar文件等的管道。看看 here for Java SPI

答案 1 :(得分: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>;
    }
}

答案 2 :(得分: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;
    }
}

答案 3 :(得分:0)

我认为您可能需要重新排序依赖项。再一次,如果不知道你的完整代码,这有点困难,但看看你的例子,似乎以下情况属实:

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

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

  • MyServiceAPI应该注入Session