ApplicationContext.getBean vs new关键字

时间:2015-08-29 14:48:45

标签: java spring jsf scope applicationcontext

我使用的是JSF + Spring + Hibernate

protected @Inject ChartOfAccount chartOfAccount;

我基本上想要从列表中填充chartOfAccount

for (DistributionEntry de : getDistributionEntries()) {

     chartOfAccount.setAccount(de.getAccount());
     chartOfAccountList.add(chartOfAccount);
}

对于每次迭代,我想要chartOfAccount的新对象,否则你知道列表包含具有最新值的相同对象。

解决方案一:使用新关键字:-p

for (DistributionEntry de : getDistributionEntries()) {
     ChartOfAccount coa= new ChartOfAccount();
     coa.setAccount(de.getAccount());
     chartOfAccountList.add(coa);
}

解决方案二:applicationContext.getBean

for (DistributionEntry de : getDistributionEntries()) {
     chartOfAccount= applicationContext.getBean(ChartOfAccount.class);
     chartOfAccount.setAccount(de.getAccount());
     chartOfAccountList.add(chartOfAccount);
}

但我已阅读某些文章以避免使用applicationContext.getBean

如果我避免使用applicationContext.getBean处理此类情况的最佳方式是什么?这两种行为都一样? (ApplicationContext.getBean vs new keyword)

  

注意:我的Managed bean是@Scope(" session"),Model是@Scope(BeanDefinition.SCOPE_PROTOTYPE),所以我们都知道,对于一个会话,它是单例和原型用于不同的会话。

1 个答案:

答案 0 :(得分:2)

如果您的ChartOfAccount实体位于Application Context并且已注入依赖项,则使用new创建的实例将不会获得任何注入的依赖项。

getBean()技术将为您提供所需的功能,但它被认为是一种不好的做法,因为您在代码中对ChartOfAccount的依赖性进行了硬编码。虽然你的方法和代码中的紧密循环,你真的没有选择。

如果ChartOfAccount是一个持久化的实体,我觉得你会在应用程序上下文中放置一个实例(即使是原型创建)也很奇怪。这里更常见的模式是使用类似Spring支持的数据访问对象。以下是Hibernate的文档:

http://docs.spring.io/spring/docs/2.0.8/reference/orm.html

五年前,你会做什么。但是,您可能需要考虑使用JPA和Spring数据:http://projects.spring.io/spring-data-jpa/。它自动生成CRUD存储库,其中包含许多开箱即用的优秀功能:查询生成,分页等。