【发布时间】:2014-07-31 05:04:47
【问题描述】:
我正在使用 CDI 注入 Hessian 服务器连接,这使我能够创建不同的服务代理。
简单示例:
@Inject HessianServer server;
NameService service;
@PostConstruct
private void init{
service = server.getProxy(NameService.class);
}
这很好用。但是我必须启动其中的许多服务。因此,我宁愿只注入服务。
我自己构建了一个 ServiceProducer 类,它根据参数化的 CDI 限定符创建服务:
@Inject HessianServer server;
@Produces
@Service(serviceType = ServiceType.NAME)
NameService produce(){
return server.getProxy(NameService.class);
}
现在我可以注入服务了:
@Inject
@Service(serviceType = ServiceType.NAME)
NameService nameService;
但是我需要这样一种生产方法来处理我想要生产的任何类型的服务。
我想改进生产者类以根据限定符参数生成合适的服务实现。然后我只需要一种生产方法,而不是为我想要生产的每个服务提供一种方法。 因此,我没有在 CDI 限定符中传递枚举值,而是传递了 classType。 比如这样的。
@Produces
@Service(serviceType = NameService.class)
_whatMustIReturnHere_ produce(InjectionPoint ip){
Service service = injectionPoint.getAnnotated().getAnnotation(Service.class);
return server.getProxy(service.getServiceType);
}
问题是:是否甚至可以根据传递的限定符参数影响生产方法的返回类型?如果有,怎么做?
【问题讨论】:
-
您的所有实现至少需要一个通用接口或超类型。
-
嗯。这是不可能的,因为我无法影响接口及其实现。所以我想答案很简单:不,不可能。
-
是的。这就是 cdi 的工作原理。容器需要注入一个实例并寻找一个生产者。因此,您将需要一个返回该类型的生产者。
-
感谢您的洞察力。