gpt4 book ai didi

java - 我可以影响 CDI 生产者的返回类型吗?

转载 作者:行者123 更新时间:2023-11-29 08:46:33 24 4
gpt4 key购买 nike

我正在使用 CDI 注入(inject) Hessian 服务器连接,这使我能够创建不同的服务代理。

简单的例子:

@Inject HessianServer server;

NameService service;

@PostConstruct
private void init{
service = server.getProxy(NameService.class);
}

这很好用。但我必须启动其中许多服务。因此,我宁愿只注入(inject)服务。

我自己构建了一个 ServiceProducer 类,它根据参数化的 CDI 限定符创建服务:

@Inject HessianServer server;

@Produces
@Service(serviceType = ServiceType.NAME)
NameService produce(){
return server.getProxy(NameService.class);
}

现在我可以注入(inject)服务了:

@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);
}

问题是:是否有可能根据传递的限定符参数影响 produce 方法的返回类型?如果是,怎么办?

最佳答案

虽然生产者方法的默认 bean 类型是返回类型的闭包,如 Bean types of a producer method 中指定的那样, 可以用 Portable extensions 覆盖类型集机制。

为了满足您的需要,您可以创建一个 CDI 扩展来观察 ProcessBeanAttributes事件,并覆盖相应的 BeanAttributes 信息,例如:

class ServiceExtension implements Extension {

void overrideBean(@Observes final ProcessBeanAttributes<NameService> pba) {
pba.setBeanAttributes(new BeanAttributes<NameService>() {

public Set<Type> getTypes() {
Set<Type> types = new HashSet<>(pba.getBeanAttributes().getTypes());
types.add(_whatMustIReturnHere_);
return types;
}

public Set<Annotation> getQualifiers() {
return pba.getBeanAttributes().getQualifiers();
}

public Class<? extends Annotation> getScope() {
return pba.getBeanAttributes().getScope();
}

public String getName() {
return pba.getBeanAttributes().getName();
}

public Set<Class<? extends Annotation>> getStereotypes() {
return pba.getBeanAttributes().getStereotypes();
}

public boolean isAlternative() {
return pba.getBeanAttributes().isAlternative();
}
};
}
}

这种方法的优点是它仍然依赖于 Typesafe resolution机制,因此如果存在不明确或未满足的依赖项,您将在应用程序部署期间获得抛出的标准异常。

关于java - 我可以影响 CDI 生产者的返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25051184/

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