JavaEE:有了CDI,我们是否需要使用';新';为了我们自己的POJO';s

JavaEE:有了CDI,我们是否需要使用';新';为了我们自己的POJO';s,java,jakarta-ee,javabeans,cdi,Java,Jakarta Ee,Javabeans,Cdi,环境: 请注意,通过“POJO”,我指的是为其他类服务的类,即除值对象、实体之外的类。 这个问题一直萦绕在我的脑后。只是想把它弄出来 基于CDI和managedbeans规范以及其他各种书籍/文章,很明显CDI注入从一个“Managed”bean实例开始。所谓“托管”,我指的是由容器管理的servlet、EJB等。从那里开始,它注入POJO(一种通过层的爬行),直到每个bean都获得它的依赖项。这一切对我来说都很有意义,我看不出开发人员为什么需要使用“new”来创建依赖POJO的实例 我想到的一

环境:

请注意,通过“POJO”,我指的是为其他类服务的类,即除值对象、实体之外的类。

这个问题一直萦绕在我的脑后。只是想把它弄出来

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

  • 我想到的一个场景是,开发人员希望有类似于
  • 但是,这也可以通过@products实现

  • 是我在wildfly 8.2.0 Final中验证为真的一个场景,即当JSP已经启动时,CDI无法注入bean
  • 
    
    但是,另一种使用servlet的方法很好

    也就是说,我想知道是否存在开发人员必须使用“新”的场景。据我所知,通过使用“new”,开发人员有责任实现对该bean及其所有依赖bean的依赖性,以及它们的依赖bean等

    提前感谢,


    Rakesh

    在使用CDI或其他容器时,您不会使用
    new
    ,因为您希望容器提供大量服务

    对于CDI,这些主要服务包括:

    • 注入依赖bean(获取现有实例或创建新实例 (实例)
    • 生命周期回调管理(
      @PostConstruct
      @PreDestroy
    • 实例的生命周期管理(一个
      @RequestScoped
      bean将使容器生成一个实例,直到请求结束)
    • 在实例上应用拦截器和装饰器
    • 登记和管理观察员方法
    • 登记和管理生产者方法
    现在,在一些罕见的情况下,您可能希望将这些服务的一部分添加到您自己实例化的类中(或另一个类似JPA的框架为您实例化)

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

    AnnotatedType type=bm.createAnnotatedType(MyClass.class);
    InjectionTarget it=bm.getInjectionTargetFactory(类型).createInjectionTarget(空);
    CreationContext ctx=bm.CreateCreationContext(空);
    MyClass pojo=新的MyClass();
    injectionTarget.injection(实例,ctx);//将尝试满足注入点
    injectionTarget.postConstruct(实例);//将呼叫@PostConstruct
    
    使用此代码,您可以实例化自己的
    MyClass
    ,其中包含注入点(
    @Inject
    )和生命周期回调(
    @PostConstruct
    ),并让容器支持这两个服务。 此功能由需要与CDI基本集成的第三方框架使用


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

    “但是,使用servlet的替代方案会出现一个小问题。注入的bean会变成一种单实例,并与servlet(每个VM一个实例)生命周期相关联。”您是如何得出这个假设/观察/结论的?也就是说,这是完全错误的,因此可能是你所有困惑的根源。听到这个很有趣。从servlet spec“对于不在分布式环境中托管的servlet(默认),servlet容器每个servlet声明只能使用一个实例。”为了证明我的观点,它是通过代码验证的,在逻辑上也是有意义的。基本上,依赖bean只被注入一次,因为servlet在每个VM中被实例化一次。你们为什么说它不正确?我不是指servlet部分。我指的是注入的豆子部分。这是一个代理。相关:啊。那真是个倒霉蛋。谢谢我明白你的意思。更正帖子…正确,我很高兴你没有走那么远:)无论如何,很难给这个问题一个明确的答案。在集成项目中,涉及到未启用CDI的框架。很高兴知道如何注入显式创建的实例。谢谢
    Wildfly 8.2.0 Final
    JDK 8
    Java EE 7
    
    if(something) { 
     use-heavy-weight-A-instance
    } else {
     use-heavy-weight-B-instance
    }
    
    <%!
      @Inject
      BeanIntf bean;
    %>
    
    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