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>的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 和 Java EE 6 集成