Лучшая практика внедрения applicationContext в Spring3 - PullRequest
8 голосов
/ 11 марта 2012

Как и в приведенном выше заголовке, меня смущают плюсы и минусы между внедрением applicationContext посредством прямой аннотации @Autowired или реализацией интерфейса ApplicationContextAware в единственном компоненте Spring.

Какой из них вы предпочитаете, в каких случаях и почему? Спасибо.

Ответы [ 4 ]

10 голосов
/ 12 марта 2012

На самом деле, оба плохие.Оба они привязывают ваше приложение к среде Spring, тем самым переворачивая всю концепцию инверсии управления.В идеальном мире ваше приложение вообще не должно осознавать, что им управляет ApplicationContext.

Если вы решили нарушить этот принцип, на самом деле не имеет значения, как вы это делаете.ApplicationContextAware - это устаревшая версия, существовавшая около как минимум с версии 2.0 .@Autowired - более новый механизм, но он работает почти так же.Я бы, наверное, пошел с ApplicationContextAware, потому что он семантически проясняет, о чем он.

2 голосов
/ 10 сентября 2013

Если вам нужно получить прототип в синглтоне, тогда вы можете использовать метод инъекции. По сути, вы создаете абстрактный метод, который возвращает нужный вам объект, а Spring будет возвращать прототип при каждом вызове этого метода. Вы определяете «метод поиска» в своем весеннем конфиге. Вот несколько ссылок: http://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-injection-spring

2 голосов
/ 12 марта 2012

Как говорит @Sean Patrick Floyd, необходимость ApplicationContext часто возникает из-за плохого дизайна. Но иногда у вас нет другого выбора. В этих случаях я предпочитаю использовать @Autowired, потому что так я внедряю все остальные свойства. Итак, если я использую @Autowired для внедрения MyRepository, почему я не могу использовать его для ApplicationContext или любого другого компонента Spring?

Я использую интерфейсы Spring только для тех вещей, которые я не могу сделать с аннотациями, например, BeanNameAware.

0 голосов
/ 12 марта 2012

Поскольку вы не расширяете ни одного из классов пружин, ваше приложение всегда отделено от фреймворка . В большинстве случаев вы не захотите внедрять ApplicationContext как есть, но вам нужно будет внедрить bean-компоненты, определенные в ApplicationContext.

Лучший вариант - всегда придерживаться минимума, если только у вас нет особых требований, а с пружиной это очень просто.

Так что либо,

  1. Аннотируйте свои бобы и scan их в application context, затем используйте @Autowire, чтобы соединить их.

  2. Используйте application context, чтобы связать ваши бобовые возможности (старые конфиги в стиле xml). Вы также можете использовать @Autowire с этим подходом.

Если вы хотите управлять жизненным циклом бина, вы можете прочитать API и настроить его, но большую часть времени эти общие настройки будут работать.

Вот несколько примеров.

  1. Компоненты Spring Auto-Wiring с аннотацией @Autowired
  2. Пружинные бобы с автоматическим подключением в стиле XML
  3. Документация API контейнера Spring IoC
...