ApplicationContext.getBean 对比新关键字
ApplicationContext.getBean vs new keyword
我正在使用 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 对比新关键字)
Note: My Managed bean is @Scope("session") and Model is @Scope(BeanDefinition.SCOPE_PROTOTYPE), so as we all know that for one session it is singleton and prototype for different session.
如果您的 ChartOfAccount 实体位于应用程序上下文中并且已注入依赖项,则使用 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 存储库:查询生成、分页等。
我正在使用 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 对比新关键字)
Note: My Managed bean is @Scope("session") and Model is @Scope(BeanDefinition.SCOPE_PROTOTYPE), so as we all know that for one session it is singleton and prototype for different session.
如果您的 ChartOfAccount 实体位于应用程序上下文中并且已注入依赖项,则使用 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 存储库:查询生成、分页等。