Java 原型和代理接口的CDI扩展
我正在为应用程序定义一个基于web的通用配置模块 这是场景用例: 您有一个高度可配置的应用程序,因此您可以定义一个接口来定义应用程序的配置,并使用Java 原型和代理接口的CDI扩展,java,cdi,weld,Java,Cdi,Weld,我正在为应用程序定义一个基于web的通用配置模块 这是场景用例: 您有一个高度可配置的应用程序,因此您可以定义一个接口来定义应用程序的配置,并使用@Config注释对接口进行注释 @Config public interface AppConfig{ boolean isPropertySet(); String getHeaderTitleLabel(); } @Config注释既是配置提供程序标记,也是CDI原型: @Documented @Inherited @Retention
@Config
注释对接口进行注释
@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应用程序)
在配置库中,用户可以获得AppConfig的实例,如:
AppConfig appConfig = ConfigManager.getInstance(AppConfig.class);
它解析@Config注释和环境变量以及属性文件中的所有需求,创建代理并连接到将提供必要配置数据的web服务
目前,工作实现由开发人员定义生产者字段/方法
@Stateless
public class ConfigProducer{
@Produces
@Config
public AppConfig getInstance(){
return ConfigManager.getInstance(AppConfig.class);
}
}
如果要基于不同的项目模块定义多个AppConfig,可能并不麻烦,但可能会带来一些不便。我只是希望我的用户按照他们的方式进行注入:@injectentitymanager em代码>不依赖于它的实例化方式
我已经定义了一个CDI扩展来注册AppConfig的实现,并启用它进行注入
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){}
}
公共类ConfigExtension实现扩展{
public void observeProcessAnnotatedType(@Observes ProcessAnnotatedType patEvent){}
public void observer BeforeBeanDiscovery(@Observes BeforeBeanDiscovery bbdEvent){
公共无效观测在Beandiscovery之后(在Beandiscovery abd之后观测){}
public void observeProcessInjectionPoint(@Observes ProcessInjectionPoint pipEvent,BeanManager bm){}
public void observeProcessInjectionTarget(@Observes ProcessInjectionTarget 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
Bean.getBeanClass()//我应该在这里返回Proxy.getProxyClass()吗?
getTypes()//这里呢?
create(creationalcontextcc)//此时,我需要返回AppConfig.class的代理
当我目前这样做时,weld实现仍然抱怨未满足的依赖性
如果您能提供帮助,我将不胜感激。阅读CDI规范后,我得出结论,我无法控制上下文引用的实例化
这已在第节中提到
7.1。对bean实例化的限制
如果应用程序需要对
上下文实例,可以使用生产者方法或字段
所以本质上,我需要检查其他框架以了解我想要做什么,或者我的用户只需要为他们声明的每个AppConfig接口定义他们自己的生产者
您可以检查deltaspike提供的配置插件是否适合您:
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