2011-12-20 4 views
1

В настоящее время я использую CDI (Weld) с tomcat 6 как сервлет-контейнер. Имея WeldLifecycleListener в конфигурации, делать инъекции наложения довольно просто.Автоматическая инъекция зависимостей с пружиной

Мой вопрос: есть ли эквивалент WeldLifecycleListener для Spring, чтобы избежать создания экземпляров bean-компонентов из ApplicationContext?

+0

Что вы подразумеваете под "избеганием контекста приложения"? –

ответ

1

Я не уверен WeldLifecycleListener, но могу дать указатели для инъекций автоматических зависимости

  1. Вы можете использовать атрибут autowire в Spring фасоли в пружинном конфигурационном файле. Читайте об этом here
  2. Вы также можете использовать аннотацию @Autowired для автоподготовки по типу и @Qualifier вместе с ней для поиска бобов по имени.
  3. @Resource аннотация может использоваться для автоматической проводки по названию.

  4. Если вы не хотите определять какие-либо компоненты в конфигурации Spring, используйте сканирование компонентов для автоматического обнаружения компонентов и используйте аннотацию @Component для вашего компонента. Этот + @ Autowire/@ Resource упростит ваши конфигурации.

2

Весной 3 вы можете использовать JSR-330 аннотации, такие как @Named и @Inject (см http://blog.springsource.com/2009/09/29/spring-framework-3-0-rc1-released/).

Классы аннотированные с @Named будут автоматически обнаружены и инстанцирован при включении сканирования компонентов, добавив следующие строки в файл конфигурации пружины:

<context:component-scan base-package="${base-package}" /> 

где ${base-package} является пакет, который содержит все компоненты (либо непосредственно или в подпакетах).

+0

Спасибо за ответы, но мой вопрос заключался не в том, как определить beans (java, xml, annotation). Это пока не проблема. С весной мне удалось получить зависимости, разрешенные в компоненте, который я получаю из applicationContext. Например, следующие работы: ctx = WebApplicationContextUtils.getRequiredWebApplicationContext (getServletContext()); testBean = (TestBean) ctx.getBean ("testBean"); Зависимости в пределах testBean разрешены правильно. Однако я не могу прямо @Inject testBean, не вызывая allicationContext. – Sordul

+0

Просто для уточнения, у вас есть сервлеты, которые управляются CDI, но хотите, чтобы Spring вставлял в них зависимости? Я не эксперт по CDI, но я бы предположил, что вам нужно выбирать для управления ими либо через CDI, либо Spring, иначе вам придется добавить собственный код, чтобы получить весенний контекст и ввести зависимость. –

+0

Хотя возможно, если вы добавили '@ Component' или' @ Controller' в класс, в который вы пытаетесь ввести зависимости (то есть класс, в котором вы пишете 'ctx = WebApplicationContext ...'). –