我正在为应用程序定义基于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
当我这样做时,焊接实现仍然抱怨不满意的依赖。
我很感激如何解决这个问题。
答案 0 :(得分:1)
在阅读了CDI规范之后,我得出的结论是我无法控制上下文引用的实例化。
这已在
部分提及7.1。对bean实例化的限制
如果应用程序需要更多控制a的实例化 可以使用上下文实例,生成器方法或字段。
所以从本质上讲,我需要检查其他框架以了解我想要做什么,或者我的用户只需要为他们声明的每个AppConfig接口定义自己的生成器。