ENV:
Wildfly 8.2.0 Final
JDK 8
Java EE 7
请注意,'POJO'指的是为其他类提供服务的类,即值对象,实体。
这个问题在我脑海中浮现了一段时间。只是想把它拿出来。
基于CDI和Managed Beans规范以及其他各种书籍/文章,很明显CDI注入以'托管'bean实例开始。 “托管”是指由容器管理的servlet,EJB等。从那里,它注入POJO(通过层爬行),直到每个bean获得其依赖。这一切对我来说都很有意义,我发现开发人员需要使用“new”来创建他们的从属POJO的实例的原因很少。
if(something) { use-heavy-weight-A-instance } else { use-heavy-weight-B-instance }
但是,这也可以通过@Produces来实现。
<%! @Inject BeanIntf bean; %>
但是,使用servlet的替代方法可以正常工作。
那就是说,想知道是否有任何开发者必须使用'new'的场景。据我所知,通过使用'new',开发人员有责任完成对该bean及其所有依赖bean及其依赖bean等的依赖关系。
提前致谢,
勒凯什
答案 0 :(得分:2)
使用CDI或其他容器时,您不能使用new
,因为您希望从容器中获得大量服务。
对于CDI,这些主要服务是:
@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
类为您处理此问题,但仍然阻止您进行实例化;)。