Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApplicationContext.getBean与新关键字_Java_Spring_Jsf_Scope_Applicationcontext - Fatal编程技术网

Java ApplicationContext.getBean与新关键字

Java 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);

我正在使用JSF+Spring+Hibernate

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!而原型创建行为是因为我总是需要新实例。感谢您宝贵的回复;)