用于构造型和代理接口的CDI扩展

时间:2014-07-02 14:19:53

标签: java cdi weld

我正在为应用程序定义基于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应用程序)

@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 EntityManager 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){}

}

我当前的问题是注册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

当我这样做时,焊接实现仍然抱怨不满意的依赖。

我很感激如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

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

这已在

部分提及
  

7.1。对bean实例化的限制

     

如果应用程序需要更多控制a的实例化   可以使用上下文实例,生成器方法或字段。

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

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