2016-02-28 51 views
0

我们可以通过两种方式获得JSF豆:首选方法来获得另一个bean:评估EL或@Inject

JobApplicant jobApplicant = (JobApplicant) FacesUtils.getManagedBean("jobApplicant"); 

Ingecting财产

@Inject 
JobApplicant jobApplicant //getter and setter required 

在第一种方法,我们可以在方法中得到一个bean,所以在不分配内存。如果它是类成员(带注入),那么它总是需要一些内存来保存对该bean的引用。同样在这种情况下,jobApplicant的范围必须至少不小于注入jobApplicant的外部豆的范围。但是在使用utils的情况下,范围可能是view,例如比外部bean的session范围更短,是吗?

什么是最好的方法来获得一个bean?

+3

'@ Inject'不是JSF,它是CDI - 不同的技术,getter和setter不是必需的。 – Geinmachi

+0

没有真正的“最佳方法”;这取决于你的环境对你的任何限制。忘记所有那些记忆话题,这只是过早的优化 - 说话(除非你已经基准测试,并且存在真实的性能问题)。就多功能性和可扩展性而言,也许'@ Inject'更可取 – kolossus

回答

0

依赖注入的一个主要优点是控制模式的反转。您不需要自己创建实例,而是告诉管理容器您需要哪些依赖关系。 所以你应该尽可能坚持“@Inject”方法。你可以在字段,构造函数和setter中使用它,所以你需要getters/setter的声明是不正确的。

你会注意到,当你的代码没有调用任何静态工厂方法,而只需要注入一个bean时,测试变得更容易。

+0

我不认为'getManagedBean()''“自己创建实例”(如'new Bean()'),但它只是通过编程方式获得托管来自JSF/CDI上下文的bean引用。所以你的答案很可能是关闭的。 – BalusC

+0

呃,我可能在这里不太清楚......从IoC的角度来看,如果你自己叫“新”或“getManagedBean”,没关系。重要的是你正在执行的代码中创建一个新的实例(或者访问一个新的引用),这使得依赖a)不透明,b)很难测试/模拟。 –