gpt4 book ai didi

java - Google Guice,如何在注入(inject)类之前和之后注入(inject)资源

转载 作者:行者123 更新时间:2023-11-30 11:42:42 25 4
gpt4 key购买 nike

我有以下情况:

类服务调用者:

public class ServiceCaller{
private Service service;
public void initialize(List<String> params){
//get the params from list and set to String objects
service = new Service(param1,param2);
}
}

类服务:

public class Service{
SomeClass classe;
public Service(String param1,String param2){
//call methods to do stuffs with params
classe = new SomeClass();
}
}

我的应用程序有一个框架,它读取 .properties 并调用 ServiceCaller 类,然后在构造后初始化并填充 ServiceCaller 中的参数。Service 类,简单地使用参数,并实例化 SomeClass 类。

我正在尝试将所有这些传递给 Google Guice,而我的类(class)是这样的:

类服务调用者:

public class ServiceCaller{
private final Service service;

@Inject
public ServiceCaller(Service service){
this.service = service;
}
public initialize(List<String> params){
//set params to objects...
}
}

和类服务:

public class Service{
private final SomeClass classe;

@Inject
public Service(SomeClass classe, String param1,String param2){
//call methods to do stuffs with params
this.classe = classe;
}
}

这是我的疑问:我该怎么做?

1 - 在 ServiceCaller 中,注入(inject)的构造函数在 initMethod 之前被调用,这样他还没有参数。我认为这会在 Service 类中生成一个 nullPointer。我如何接收字符串参数?

2 - 如何在 ServiceCaller 类中注入(inject)服务类?他需要调用 init,使用参数挂载 Service 类,并且仅在此时将 Service(已经带有参数)注入(inject) ServiceCaller。

最佳答案

配置 Service 真的是 ServiceCaller 的工作吗?如果是这样,那么这种情况就不太适合依赖注入(inject)了。只需像现在一样使用 new 创建 Service

但创建 Service 可能并不是真正的 ServiceCaller 的工作。相反,您应该将参数直接注入(inject)到 Service 中进行配置,然后将配置好的 Service 注入(inject)到 ServiceCaller 中。

现在,如果问题是参数来自ServiceCaller,但是需要注入(inject)SomeClass,那么ServiceCaller和Guice 将能够自己完成这项工作。我建议你拆分构造:创建一个 ServiceFactory 可以用 SomeClass 注入(inject),然后注入(inject) ServiceCaller,然后提供一个接受参数的工厂方法。像这样的东西:

ServiceCaller {
private final ServiceFactory serviceFactory;
private Service service;

@Inject
public ServiceCaller(ServiceFactory serviceFactory) {
this.serviceFactory = serviceFactory;
}

public void initialize(List<String> params) {
service = serviceFactory.create(params.get(0), params.get(1));
}
}

class Service {
private final SomeClass classe;

public Service(SomeClass classe, String param1, String param2) {
//call methods to do stuffs with params
this.classe = classe;
}
}

class ServiceFactory {
private final SomeClass classe;

@Inject
public ServiceFactory(SomeClass classe) {
this.classe = classe;
}

public Service create(String param1, String param2) {
return new Service(classe, param1, param2);
}
}

关于java - Google Guice,如何在注入(inject)类之前和之后注入(inject)资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com