我有一个简单的要求 -
这是我想要注入CalledService
的对象的服务。
public class CallingService {
private CalledService service;
@Inject
public CallingService(CalledService svc) {
service = svc;
}
}
CalledService
看起来像这样 -
public class CalledService {
private String variable_value;
public CalledService(String parameter) {
variable_value = parameter;
}
}
让我们在psvm
中说,我正在编写此代码以供执行 -
Injector injector = Guice.createInjector(new AppInjector());
CallingService service = injector.getInstance(CallingService.class);
问题是如果CalledService
有一个非参数化的构造函数,那么它可以正常工作。但由于它是参数化的,我不知道如何注入参数值。
此外,其他一些服务可能希望使用不同的参数值注入CalledService
。所以我不想将任何静态值绑定到参数。
有人能建议使用Google Guice实现最简单的方法吗?此外,我在这个论坛上找到了很多答案,但它们并不是我想要的,而且有些解决方案过于复杂。提前谢谢。
答案 0 :(得分:1)
谢谢,@ Luigi和@vsbehere帮助我。我还浏览了你们之前分享过的stackoverflow链接。
那里提到的答案对我来说似乎有点复杂,我希望使用Google Guice注入参数的方法更简单一些。我非常耐用的一件事是工厂级,我想知道它的用法是否可以避免。然后我经历了这个documentation,我对我有意义。
总结一下,FactoryInterface
的目的是帮助Guice构建对象。 AssistedInject
将create()
方法的参数映射到实现类的构造函数中的相应@Assisted
参数,在此示例中,实现类是CalledService
。 Factory Interface中的create()
方法仅使用辅助参数,并且应确保它们与构造函数中的顺序相同。
我希望上一段有意义,这就解释了为什么需要一个因子类。这就是我解决上述问题的方法 -
CalledService
现在看起来像这样,参数中现在有一个@Assisted
关键字 -
public class CalledService {
private String variable_value;
@Inject
public CalledService(@Assisted String parameter) {
variable_value = parameter;
}
public void printValue() {
System.out.println(variable_value);
}
}
CalledServiceFactory是一个新添加的,其目的是创建CalledService的对象。这就是它的样子 -
public interface CalledServiceFactory {
CalledService create(String var);
}
CallingService
现在看起来像这样,我们现在正在向此类注入CalledServiceFactory
实例,这有助于创建CalledService
的实例 -
public class CallingService {
@Inject
private CalledServiceFactory factory;
public void callingMethod() {
CalledService service = factory.create("someValue");
service.printValue();
}
}
在模块内部,我配置了CalledServiceFactory
-
public class AppInjector extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.build(CalledServiceFactory.class));
}
}
最后,为了执行它,这就是我在main函数中执行它的方式 -
private static void main() {
Injector injector = Guice.createInjector(new AppInjector());
CallingService service = injector.getInstance(CallingService.class);
service.callingMethod();
}
这就是我实现它的方式,这是我可以最简单的修改它。如果有人有任何最佳解决方案,请告诉我。
答案 1 :(得分:0)
答案 2 :(得分:0)
我害怕你转错了。相反,请看一下提供方法(同样,使用界面绑定来释放Guice'全部潜力!):
public interface CallingService {
void requestStuffExecution();
}
接口1:
public interface CalledService {
void doStuff();
}
接口2:
import com.google.inject.Inject;
public class DefaultCallingService implements CallingService {
private DefaultCalledService service;
@Inject
public DefaultCallingService(DefaultCalledService svc) {
service = svc;
}
@Override
public void requestStuffExecution() {
service.doStuff();
}
}
默认Impl1:
import com.google.inject.Inject;
public class DefaultCalledService implements CalledService {
private String parameter;
@Inject
public DefaultCalledService(String par) {
this.parameter = par;
}
@Override
public void doStuff() {
System.out.println("Oh boy, always so much stuff to do! Performing: " + parameter);
}
}
默认Impl2:
Cron.run
打印:"哦,男孩,总是这么多东西要做!执行:<输入字符串>"。