Этот пост является побегом из XML-избыточности. Как указывалось в последнем посте , есть некоторые, кто не любит настраивать внедрение зависимостей (DI) в XML. Они называют это «Ад XML»!
В последнем посте мы показали, что использование JSF для управления bean-компонентами и выполнения некоторых базовых DI было очень многословным. Затем пост показал, насколько простым DI с XML может быть в Spring. Затем мы использовали Spring Java Spring Config, чтобы полностью избавиться от конфигурации XML.
В этом посте используется DI и управление областью действия, основанные на аннотациях Spring 2.5
В примере был контроллер с именем ContactController. У ContactController было три зависимости, которые были введены, названные ContactRepository, GroupRepository и TagRepository.
В этой статье показано, как использовать инъекции аннотаций в стиле Spring 2.5. Внедрение аннотаций в Spring 2.5 немного отличается от Spring Java Config, так как вы непосредственно аннотируете классы, которыми управляет Spring.
Чтобы идентифицировать bean-компонент как объект, которым управляет Spring, необходимо аннотировать его с помощью @Repository, @Service, @Component, @Controller и т. Д. Или определить собственные пользовательские аннотации, чтобы обозначить, что Spring управляет вашим bean-компонентом.
Давайте рассмотрим пример, ContactController, который аннотирован @Controller. Это идентифицирует ContactController для Spring для управления. Обратите внимание, что ContractController помещен в область действия Session, то есть вот модифицированные контроллеры следующим образом:
package com.arcmind.contact.controller;
...
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller
@Scope("session")
public class ContactController extends AbstractCrudController{
Если вы не укажете спецификатор, именем компонента по умолчанию будет «contactController».
ContactRepository, который аннотируется @Repositoryr. Это идентифицирует ContactRepository для Spring, которым нужно управлять. Обратите внимание, что ContractRepository помещен в область SINGLETON по умолчанию, которая аналогична области приложения API сервлетов.
package com.arcmind.contact.model;
...
import org.springframework.stereotype.Repository;
@Repository
public class ContactRepository {
Другие репозитории настроены таким же образом.
Аналогичным образом мы управляем хранилищем групп и хранилищем тегов. Как только все репозитории будут управляться, мы можем использовать их из ContactController, используя @Autowired, следующим образом:
public class ContactController extends AbstractCrudController{
/** Contact Controller collaborates with contactRepository. */
@Autowired(required=true) @Qualifier("contactRepository")
private ContactRepository contactRepository;
@Autowired(required=true) @Qualifier("groupRepository")
private GroupRepository groupRepository;
@Autowired(required=true) @Qualifier("tagRepository")
private TagRepository tagRepository;
Spring предоставляет множество способов внедрения зависимостей с помощью аннотаций: аргументы метода, свойства JavaBean и аргументы конструктора. Мой любимый подход — выше, который заключается в том, чтобы вводить непосредственно в поле, не загрязняя мой класс свойствами JavaBean и т. Д.
Spring может сканировать имена пакетов, чтобы найти компоненты для управления следующим образом:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.arcmind.contact"/>
</beans>
Выше приведена однократная настройка.
Одна вещь, которая мне не нравится в вышесказанном, — это то, что ваши классы импортируют классы, специфичные для Spring, которые загрязняют ваши бины другим API только для получения DI. Тем не менее, Spring предоставляет возможность определять свои собственные аннотации, которые не привязаны к Spring, но все же могут идентифицировать ваши классы для управления областями и DI Spring.
(Вы можете найти приведенный выше пример, используя DI-аннотацию Spring 2.5 в Архитектурном тестировании концепции: пример контактов 6 ).
Использование Spring с JSF дает много преимуществ, так что ждите новых постов на эту тему. Этот пост просто царапает поверхность власти весны. Кроме того, Том Селуччи, Пол Хиксон и я пишем серию статей для IBM developerWorks по эффективному объединению JSF, JPA и Spring. Первая статья посвящена Spring DI и JSF и содержит пошаговые инструкции по объединению Spring и JSF.
Примеры из этой серии Spring / JSF дополнят примеры из этой серии руководств по JSF 1.2.
Что вы думаете о Spring 2.5 аннотированном DI и управлении областью?
Об авторе
— технический директор Mammatus и эксперт по Java и облачным вычислениям . Рик вовлечен в адвокацию Java CDI и Java EE. Реализации CDI — Resin Candi — Сварка шва — Apache OpenWebBeans