【问题标题】:CDI Extension for stereotypes and proxied interfaces原型和代理接口的 CDI 扩展
【发布时间】:2014-08-23 09:20:56
【问题描述】:

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

如果你要根据不同的项目模块定义多个appconfigs,可能不会很麻烦,但可能会带来一些不便。我只是希望我的用户按照他们会做的方式进行注入:@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

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

如果您能帮助我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: java cdi weld


    【解决方案1】:

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

    这在

    部分已经提到

    7.1。 bean 实例化的限制

    如果应用程序需要对 上下文实例,可以使用生产者方法或字段。

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

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

    【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2017-03-04
    • 2016-12-26
    • 2015-04-01
    • 1970-01-01
    • 2015-02-07
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多