Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 原型和代理接口的CDI扩展_Java_Cdi_Weld - Fatal编程技术网

Java 原型和代理接口的CDI扩展

Java 原型和代理接口的CDI扩展,java,cdi,weld,Java,Cdi,Weld,我正在为应用程序定义一个基于web的通用配置模块 这是场景用例: 您有一个高度可配置的应用程序,因此您可以定义一个接口来定义应用程序的配置,并使用@Config注释对接口进行注释 @Config public interface AppConfig{ boolean isPropertySet(); String getHeaderTitleLabel(); } @Config注释既是配置提供程序标记,也是CDI原型: @Documented @Inherited @Retention

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

这是场景用例:

您有一个高度可配置的应用程序,因此您可以定义一个接口来定义应用程序的配置,并使用
@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