Java EE:有了CDI,我们是否需要为自己的POJO使用'new'

时间:2015-10-02 10:52:53

标签: java java-ee javabeans cdi

ENV:

Wildfly 8.2.0 Final
JDK 8
Java EE 7

请注意,'POJO'指的是为其他类提供服务的类,即值对象,实体。

这个问题在我脑海中浮现了一段时间。只是想把它拿出来。

基于CDI和Managed Beans规范以及其他各种书籍/文章,很明显CDI注入以'托管'bean实例开始。 “托管”是指由容器管理的servlet,EJB等。从那里,它注入POJO(通过层爬行),直到每个bean获得其依赖。这一切对我来说都很有意义,我发现开发人员需要使用“new”来创建他们的从属POJO的实例的原因很少。

  1. 我想到的一个场景是开发人员希望逻辑与
  2. 类似
    if(something) { 
     use-heavy-weight-A-instance
    } else {
     use-heavy-weight-B-instance
    }
    

    但是,这也可以通过@Produces来实现。

    1. Here是我在wildfly 8.2.0 Final中验证为真的一种情况,即当JSP有
    2. 时CDI无法注入bean
      <%!
        @Inject
        BeanIntf bean;
      %>
      

      但是,使用servlet的替代方法可以正常工作。

      那就是说,想知道是否有任何开发者必须使用'new'的场景。据我所知,通过使用'new',开发人员有责任完成对该bean及其所有依赖bean及其依赖bean等的依赖关系。

      提前致谢,

      勒凯什

1 个答案:

答案 0 :(得分:2)

使用CDI或其他容器时,您不能使用new,因为您希望从容器中获得大量服务。

对于CDI,这些主要服务是:

  • 注入依赖bean(获取现有实例或创建新实例) 实例)
  • 生命周期回调管理(@PostConstruct@PreDestroy
  • 您的实例的生命周期管理(@RequestScoped bean将使容器生成一个实例,直到请求结束)
  • 在您的实例上应用拦截器和装饰器
  • 注册和管理观察员方法
  • 注册和管理生产者方法

现在,在极少数情况下,您可能希望将这些服务的一部分添加到您自己实例化的类中(或者像JPA实例化的另一个框架)。

BeanManager bm = CDI.current()。getBeanManager();

AnnotatedType<MyClass> type = bm.createAnnotatedType(MyClass.class);
InjectionTarget<MyClass> it = bm.getInjectionTargetFactory(type).createInjectionTarget(null);
CreationalContext<MyClass> ctx = bm.createCreationalContext(null);

MyClass pojo = new MyClass();
injectionTarget.inject(instance, ctx); // will try to satisfied injection points 
injectionTarget.postConstruct(instance); // will call @PostConstruct

使用此代码,您可以实例化您自己的MyClass包含注入点(@Inject)和生命周期回调(@PostConstruct),并让容器尊重这两项服务。 此功能由需要与CDI进行基本集成的第三方框架使用。

Unmanaged类为您处理此问题,但仍然阻止您进行实例化;)。