2015-08-29 4 views
4

Я использую JSF + Spring + HibernateApplicationContext.getBean против нового ключевого слова

protected @Inject ChartOfAccount chartOfAccount; 

Я в принципе хочу, чтобы заполнить chartOfAccount из списка

for (DistributionEntry de : getDistributionEntries()) { 

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

для каждой итерации я хочу новый объект chartOfAccount иначе вы знаете, что список содержит тот же объект с последним значением.

Solution One: использовать новое ключевое слово :-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 против нового ключевого слова)

Примечание: Мой управляемый компонент @Scope («сессия») и Модель @Scope (BeanDefinition.SCOPE_PROTOTYPE), так как все мы знаем, что за один сеанс это singleton и prototype для разных сеансов.

+0

Прежде всего, пожалуйста, расскажите, какую бизнес-логику инкапсулировали в ChartOfAccount? Есть ли поля в окне? Существует разница между «новыми ChartOfAccount()» и «applicationContext.getBean (ChartOfAccount.class)». В первом случае вы создаете объект самостоятельно, а поля с автоповтором должны быть пустыми, с другой стороны, если вы создадите ChartOfAccount, используя контекст приложения, это будет Spring Bean. Spring управляет зависимостями для вас и вводит их в экземпляр ChartOfAccount. –

+0

@NechaevSergey нет никакой бизнес-логики в ChartOfAccount, это просто модель '@Scope (BeanDefinition.SCOPE_PROTOTYPE) открытый класс ChartOfAccount реализует Serializable {' –

+0

Похоже, что ChartOfAccount должен быть POJO-классом. Удалите декларацию bean и используйте новое ключевое слово для создания экземпляра. Поскольку @Robert Moskal сказал, что есть общие закономерности, где использовать весенние бобы. Прочитайте документацию для последующих действий –

ответ

2

Если ваш объект 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 с большим количеством хороших функций из коробки: генерация запросов, разбиение на страницы и т. Д.

+0

Экземпляр объекта в контексте приложения. Если бы я сказал, почему я использую ** новое ** ключевое слово, если я использую Spring DI. Единственная причина в том, что я спрашиваю весну храните мою сущность в своей области, и я буду принимать все, что мне нужно. если вы видите следующую ссылку mkyong, она в основном объявляет все бобы в области весенних бобов, а затем берет из нее. [mkyong.com] (http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/), так же, как я беру из контекста, если мне требуется больше объектов вместо новых ключевое слово. :) –

+0

Я думаю, что ApplicationContext.getBean считается плохой практикой, только когда мы используем его с Service/DAO, и я использую только с сущностью. В основном я ненавижу использовать ** новое ** ключевое слово с сущностью, сервисом и классами DAO: p! И прототипное поведение творения заключается в том, что мне всегда нужен новый экземпляр. ** Спасибо за ваш драгоценный ответ **;) –

Смежные вопросы