gpt4 book ai didi

java - 用于构造型和代理接口(interface)的 CDI 扩展

转载 作者:行者123 更新时间:2023-12-01 12:47:37 25 4
gpt4 key购买 nike

我正在为应用程序定义一个基于 Web 的通用配置模块。

这是场景用例:

您拥有高度可配置的应用程序,因此您定义一个接口(interface)来定义应用程序的配置,然后使用 @Config 注释对该接口(interface)进行注释。

@Config
public interface AppConfig{
boolean isPropertySet();
String getHeaderTitleLabel();
}

@Config 注释既是配置提供程序标记又是 CDI 构造型:

@Documented
@Inherited
@Retention(RUNTIME)
@Target({FIELD, PARAMETER, TYPE, METHOD})
@Qualifier
@Named
@SessionScoped
public @interface Config{
}

在应用程序级别(假设启用了 CDI 的 jsf 应用程序)

@Named
@SessionScoped
public class MyController implements Serializable{
@Inject
@Config
private AppConfig appConfig;
}

在配置库上,用户可以获得 AppConfig 的实例,如下所示:

AppConfig appConfig = ConfigManager.getInstance(AppConfig.class);

它解决了 @Config 注释、环境变量和属性文件的所有要求,创建代理并连接到将提供必要的配置数据的 Web 服务。

目前,工作实现是由开发人员定义生产者字段/方法。

@Stateless
public class ConfigProducer{

@Produces
@Config
public AppConfig getInstance(){
return ConfigManager.getInstance(AppConfig.class);
}
}

如果你要根据不同的项目模块定义多个appconfig,可能不会很麻烦,但可能会带来一些不便。我只是希望我的用户按照他们的方式进行注入(inject):@Inject EntityManager em;而不依赖于它的实例化方式。

我定义了一个 CDI 扩展来注册 AppConfig 的实现并启用它进行注入(inject)。

public class ConfigExtension implements Extension{

public void observeProcessAnnotatedType(@Observes ProcessAnnotatedType patEvent){}
public void observerBeforeBeanDiscovery(@Observes BeforeBeanDiscovery bbdEvent){}
public void observeAfterBeanDiscovery(Observes AfterBeanDiscovery abd){}
public<T,X> void observeProcessInjectionPoint(@Observes ProcessInjectionPoint<T,X> pipEvent, BeanManager bm){}
public<T,X> void observeProcessInjectionTarget(@Observes ProcessInjectionTarget<T,X> pipEvent, BeanManager bm){}

}

我当前的问题是哪个是注册 AppConfig 实现的正确观察者事件?我研究过 Bean,其中一些最令人困惑的部分是

Bean.getBeanClass(); //should i return Proxy.getProxyClass() here?
Bean.getTypes(); //and here?
Bean.create(CreationalContext<T> cc); //at this point i need to return the proxy for AppConfig.class

当我当前执行此操作时, Weld 实现仍然提示依赖性不满足。

我希望获得有关如何解决此问题的帮助。

最佳答案

阅读 CDI 规范后,我得出的结论是我无法控制上下文引用的实例化。

这已在第 5 节中提到

7.1. Restriction upon bean instantiation

If the application requires more control over instantiation of a contextual instance, a producer method or field may be used.

所以本质上,我需要检查其他框架来了解我想要做什么,或者我的用户只需为他们声明的每个 AppConfig 接口(interface)定义自己的生产者。

http://docs.jboss.org/cdi/spec/1.0/pdf/JSR-299-FD.pdf

关于java - 用于构造型和代理接口(interface)的 CDI 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24533578/

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