我有一个关于依赖注入的问题。
我有一节课,比如说:
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,我可能可以在创建会话的类中创建它,并使用设置器将其设置为MyClass。
但问题是,我真的不想让MyAnotherClass创建MyServiceAPI并将其注入到MyClass中。我不想让MyAnotherClass知道MyServiceAPI的存在。
有没有办法使用像Guice或Spring这样的depdendency注入器来做这件事?或者仅仅是Java?
非常感谢。
发布于 2012-04-19 03:18:57
如果您希望用纯Java进行依赖注入,可以通过内置的Java服务提供者接口从Java6开始提供一些支持。尽管它需要对jar文件等进行一些处理。看一看 here for Java SPI
发布于 2012-04-19 03:43:31
可能的解决方案与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-19 03:52:25
你只需要用一个很好的老式工厂就行了。
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;
}
}https://stackoverflow.com/questions/10216166
复制相似问题