Java ApplicationContext.getBean与新关键字
我正在使用JSF+Spring+HibernateJava ApplicationContext.getBean与新关键字,java,spring,jsf,scope,applicationcontext,Java,Spring,Jsf,Scope,Applicationcontext,我正在使用JSF+Spring+Hibernate protected @Inject ChartOfAccount chartOfAccount; for (DistributionEntry de : getDistributionEntries()) { ChartOfAccount coa= new ChartOfAccount(); coa.setAccount(de.getAccount()); chartOfAccountList.add(coa);
protected @Inject ChartOfAccount chartOfAccount;
for (DistributionEntry de : getDistributionEntries()) {
ChartOfAccount coa= new ChartOfAccount();
coa.setAccount(de.getAccount());
chartOfAccountList.add(coa);
}
for (DistributionEntry de : getDistributionEntries()) {
chartOfAccount= applicationContext.getBean(ChartOfAccount.class);
chartOfAccount.setAccount(de.getAccount());
chartOfAccountList.add(chartOfAccount);
}
我基本上想从列表中填充chartofcount
for (DistributionEntry de : getDistributionEntries()) {
chartOfAccount.setAccount(de.getAccount());
chartOfAccountList.add(chartOfAccount);
}
对于每个迭代,我希望新的对象chartOfAccount
,否则您知道列表包含具有最新值的相同对象
解决方案一:使用新关键字:-p
protected @Inject ChartOfAccount chartOfAccount;
for (DistributionEntry de : getDistributionEntries()) {
ChartOfAccount coa= new ChartOfAccount();
coa.setAccount(de.getAccount());
chartOfAccountList.add(coa);
}
for (DistributionEntry de : getDistributionEntries()) {
chartOfAccount= applicationContext.getBean(ChartOfAccount.class);
chartOfAccount.setAccount(de.getAccount());
chartOfAccountList.add(chartOfAccount);
}
解决方案二:applicationContext.getBean
protected @Inject ChartOfAccount chartOfAccount;
for (DistributionEntry de : getDistributionEntries()) {
ChartOfAccount coa= new ChartOfAccount();
coa.setAccount(de.getAccount());
chartOfAccountList.add(coa);
}
for (DistributionEntry de : getDistributionEntries()) {
chartOfAccount= applicationContext.getBean(ChartOfAccount.class);
chartOfAccount.setAccount(de.getAccount());
chartOfAccountList.add(chartOfAccount);
}
但是我读过一些文章,这些文章是为了避免使用applicationContext.getBean
如果我避免使用applicationContext.getBean
,处理这种情况的最佳方法是什么?和这两种行为将是相同的?(ApplicationContext.getBean vs new关键字)
protected @Inject ChartOfAccount chartOfAccount;
for (DistributionEntry de : getDistributionEntries()) {
ChartOfAccount coa= new ChartOfAccount();
coa.setAccount(de.getAccount());
chartOfAccountList.add(coa);
}
for (DistributionEntry de : getDistributionEntries()) {
chartOfAccount= applicationContext.getBean(ChartOfAccount.class);
chartOfAccount.setAccount(de.getAccount());
chartOfAccountList.add(chartOfAccount);
}
注意:我的托管bean是@Scope(“session”),模型是@Scope(BeanDefinition.Scope\u PROTOTYPE),所以我们都知道,对于一个会话,它是单例的,对于不同的会话,它是原型的
如果您的ChartOfcount实体位于应用程序上下文中并且具有注入的依赖项,则使用new创建的实例将不会获得任何这些注入的依赖项 getBean()技术可以满足您的需要,但它被认为是一种不好的做法,因为您在代码中硬编码对ChartOfAccount的依赖关系。尽管有了您的方法和代码中的紧密循环,您真的没有选择的余地 如果ChartOfAccount是一个持久化的实体,那么在我看来,将它的一个实例放在应用程序上下文中似乎很奇怪(即使使用原型创建)。这里更常见的模式是对数据访问对象使用类似Spring的支持。以下是Hibernate的文档:
五年前你会这么做的。但是,您可能需要考虑使用JPA和Spring数据:它自动生成CRUD存储库,具有许多现成的功能:查询生成、分页等。首先,请告诉我ChartoAccount中封装了哪种业务逻辑?对象中是否有自动连接字段?
new ChartOfAccount()
和applicationContext.getBean(ChartOfAccount.class)
之间存在差异。在第一种情况下,您自己创建对象,并且自动连接字段将为null,另一方面,如果您使用应用程序上下文创建ChartOfAccount,则它将是Springbean。Spring为您管理依赖项并将它们注入ChartOfAccount实例。@NechaevSergey ChartOfAccount中没有任何业务逻辑,它只是一个模型@Scope(BeanDefinition.Scope\u PROTOTYPE)公共类ChartOfAccount实现了可序列化{
看起来ChartOfAccount应该是POJO类。删除bean声明并使用new关键字创建实例。正如@Robert Moskal所说,使用spring bean有一些常见的模式。阅读后续文档了解如何使用CDI特定的工件注入spring管理的bean@inject
(protected@Inject-ChartOfAccount-ChartOfAccount;
)?获取Spring管理bean的容器管理实例需要使用@Autowired
注释(或ApplicationContext.getBean(“beanName”)
)注入该bean。只需使用new
操作符即可(因此,自己调用bean的构造函数)只需创建一个bean的新实例,该实例无论如何都不是由容器管理的。@Tiny我使用的是JSR-330标准注入(@Named@Inject),sprint对此提供支持。@Named@Scope(BeanDefinition.Scope\u PROTOTYPE)公共类ChartoAccount实现可序列化{
应用程序上下文中实体的一个实例:如果我使用spring DI,If会说为什么我要使用new关键字。唯一的原因是我要求spring将我的实体存储在您的bean区域,我会在需要时获取。如果您看到下面的mkyong链接,它基本上会声明spring bean区域中的所有bean,然后从t获取如果我需要更多的对象而不是新的关键字,则使用与上下文相同的方法:我认为ApplicationContext.getBean被认为是一种不好的做法,只有当我们将其与服务/DAO一起使用时,我才将其与实体一起使用。基本上,我不喜欢在实体、服务和DAO类中使用new关键字:p!而原型创建行为是因为我总是需要新实例。感谢您宝贵的回复;)