Java EE 6:@Inject 和 Instance<T>

Posted

技术标签:

【中文标题】Java EE 6:@Inject 和 Instance<T>【英文标题】:Java EE 6 : @Inject and Instance<T> 【发布时间】:2012-03-02 20:26:21 【问题描述】:

我对 java ee 6 中的 @Inject 注释有疑问:

有什么区别:

@Inject
private TestBean test;

@Inject
private Instance<TestBean> test2;

有参考:

test2.get();

关于 Instance 的一些信息:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

也许在 get() 调用它之前它不会创建对象?我只是想知道哪一个更适合jvm内存。我认为直接@Inject 将直接创建对象的实例,即使它没有被应用程序使用...

谢谢!

【问题讨论】:

我的回答是否足够,或者我可能误解了您的问题?如果您偶然发现它有用,请不要忘记投票和/或将其标记为已接受。谢谢! 【参考方案1】:

可以在文档中找到有关实例用例的更多信息:

在某些情况下,注入并不是获取上下文引用最方便的方法。例如,它可能不会在以下情况下使用:

bean 类型或限定符在运行时动态变化 可能没有满足类型和限定符的 bean 我们想遍历某种类型的所有 bean

这很酷,所以你可以做类似的事情

@Inject @MyQualifier Instance<MyType> allMycandidates;

因此您可以从 allMyCandidates 获取一个 Iterator 并遍历所有符合条件的对象。

【讨论】:

【参考方案2】:

第二个是所谓的延迟注入或初始化。在大多数情况下调用 get() 之前,您的容器将选择为 TestBean 定位、初始化和注入适当的对象。

至于“哪个更好”,你应该遵循优化的规则。在遇到问题之前不要进行优化,并使用分析器。

换句话说,请使用第一个,除非您可以明确证明第二个可以为您节省大量内存和 cpu。

如果这回答了你的问题,请告诉我!

【讨论】:

感谢回复,事实上我想将它用于 Vaadin 框架(基于 GWT),我想知道将所有 UI 组件作为 Inject 是否会杀死以下性能:@Inject LoginScreen login screen 实际上,在应用程序启动时,他会将所有注入加载到 jvm 上,如果用户不使用它们会导致性能下降...... 我真的怀疑你会看到直接注入对性能的影响。我肯定会走这条路,不会冒技术债务的风险!我在春季用 50 多个 bean 编写了大量的 DI 注入应用程序,并没有看到 DI 的影响。 所以你的意思是在 jee 6 中做很多 Inject 注释不会降低客户端的性能? 是的。进行大量注入不太可能影响用户体验。自己试试吧;如果由于某种原因不太可能影响用户体验,请返回堆栈溢出,我们可以帮助您使用 visualvm 来分析您的代码。 是否可以将有状态实例注入到无状态 bean 中的方法中?我只想将实例绑定到方法上下文。

以上是关于Java EE 6:@Inject 和 Instance<T>的主要内容,如果未能解决你的问题,请参考以下文章

javax.inject.Inject是哪个jar包里的

Java EE 6 和 CDI

Spring Security 和 Java EE 6 集成

构建 Java EE 6 项目时出现 FilerException

使用 java EE 6 注释的 Servlet 过滤?

Java EE 6 安全性和重定向