CDI PostConstruct使用服务生产者

时间:2014-10-17 12:18:52

标签: java-ee cdi weld

我正在尝试使用Java EE 6构建应用程序。开发在TomEE 1.7上完成。由于各种原因,我必须通过服务生产者创建我的大多数CDI托管对象。但是,当我这样做时,不会调用创建的bean的@PostConstruct注释方法。如果我把服务生产者放在一边让CDI直接通过它的构造函数创建对象,它就会被调用。这是正常的,还是TomEE附带的CDI提供程序(Open WebBeans)的错误

由于

2 个答案:

答案 0 :(得分:2)

这是正常行为。当容器初始化bean时,将调用@PostConstruct方法。见Weld Reference

  

简化一点,事情按此顺序发生:

     
      
  • 首先,容器调用bean构造函数(默认构造函数或带注释的@Inject),以获取实例   豆子。

  •   
  • 接下来,容器初始化bean的所有注入字段的值。

  •   
  • 接下来,容器调用bean的所有初始化方法(调用顺序不可移植,不依赖它)。
  •   
  • 最后,调用@PostConstruct方法(如果有的话)。
  •   

但是在生产者方法的情况下,您可以完全控制对象的创建方式,因此您可以自己调用任何所需的方法。请注意,在生成器方法对象通常使用new创建,因此注释字段不会被初始化。再次检查producer method documentation以寻找可能的解决方案(注入生产者方法,@New

答案 1 :(得分:0)

将生产者用于所有事情似乎是不好的做法 - 如果您的课程使用@PostConstruct进行注释,为什么要使用制作人?

执行此操作的一种方法是使用生产者方法中的创建上下文来提供引用,然后在该引用上调用post构造。以下是一些示例代码,取自Apache DeltaSpike,一套CDI扩展:

BeanProvider

    BeanManager beanManager = getBeanManager();

    CreationalContext creationalContext = beanManager.createCreationalContext(null);

    AnnotatedType annotatedType = beanManager.createAnnotatedType(instance.getClass());
    InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotatedType);
    injectionTarget.inject(instance, creationalContext);
    injectionTarget.postConstruct(instance);