我对依赖注入有疑问。
我有一节课,说:
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?
非常感谢。
答案 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
。