JavaEE:有了CDI,我们是否需要使用';新';为了我们自己的POJO';s
环境: 请注意,通过“POJO”,我指的是为其他类服务的类,即除值对象、实体之外的类。 这个问题一直萦绕在我的脑后。只是想把它弄出来 基于CDI和managedbeans规范以及其他各种书籍/文章,很明显CDI注入从一个“Managed”bean实例开始。所谓“托管”,我指的是由容器管理的servlet、EJB等。从那里开始,它注入POJO(一种通过层的爬行),直到每个bean都获得它的依赖项。这一切对我来说都很有意义,我看不出开发人员为什么需要使用“new”来创建依赖POJO的实例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的实例 我想到的一
但是,另一种使用servlet的方法很好
也就是说,我想知道是否存在开发人员必须使用“新”的场景。据我所知,通过使用“new”,开发人员有责任实现对该bean及其所有依赖bean的依赖性,以及它们的依赖bean等
提前感谢,
Rakesh在使用CDI或其他容器时,您不会使用
new
,因为您希望容器提供大量服务
对于CDI,这些主要服务包括:
- 注入依赖bean(获取现有实例或创建新实例 (实例)
- 生命周期回调管理(
和@PostConstruct
)@PreDestroy
- 实例的生命周期管理(一个
bean将使容器生成一个实例,直到请求结束)@RequestScoped
- 在实例上应用拦截器和装饰器
- 登记和管理观察员方法
- 登记和管理生产者方法
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