1. Обзор
В этом учебнике мы узнаем о различиях между двумя основными элементами конфигурации XML Spring: <контекст:аннотация-конфиг> и <контекст:компонент-сканирование> .
2. Определения фасоли
Как мы все знаем, Spring предоставляет нам два способа определения наших бобов и зависимостей: конфигурацию XML и аннотации Java. Мы также можем классифицировать аннотации весны под две группы: аннотации инъекций зависимости и аннотации фасоли.
До аннотации мы должны были вручную определить все наши бобы и зависимости в файлах конфигурации XML. Теперь, благодаря аннотациям Весны, он может автоматически обнаружить и проволоки все наши бобы и зависимости для нас . Таким образом, мы можем по крайней мере устранить XML, необходимый для бобов и зависимостей.
Тем не менее, мы должны помнить, что аннотации бесполезны, если мы не активируем их . Для того, чтобы активировать их, мы можем добавить любой <контекст:аннотация-конфиг> или <контекст:компонент-> в верхней части нашего файла XML.
В этом разделе мы увидим, как <контекст:аннотация-конфиг> и <контекст:компонент-сканирование> отличаются друг от друга с точки зрения способов активации аннотации.
3. Активация аннотации <контекстом:аннотация-конфиг>
<контекст:аннотация-конфиг> аннотация в основном используется для активации аннотации инъекций зависимости. @Autowired , @Qualifier , @PostConstruct , @PreDestroy и @Resource являются одними из тех, которые <контекст:аннотация-> может решить.
Давайте рассмотрим простой пример того, как <контекст:аннотация-конфигурация> может упростить конфигурацию XML для нас.
Во-первых, давайте создадим класс с полем зависимости:
public class UserService { @Autowired private AccountService accountService; }
public class AccountService {}
Теперь, давайте определим наши бобы.
Прежде чем идти дальше, давайте узнаем, что нам все еще нужно объявить бобы в XML. Это потому, <контекст:аннотация-конфиг> активирует аннотации только для бобов, уже зарегистрированных в контексте приложения .
Как видно здесь, мы аннотировали учетная записьСервис поле с использованием @Autowired . @Autowired говорит Весна, что это поле является зависимостью, которая должна быть автоматически проводной соответствия фасоли.
Если бы мы не использовали @Autowired , то мы должны были бы установить учетная записьСервис зависимость вручную:
Теперь мы можем сослаться на наши бобы и зависимости в единице теста:
@Test public void givenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:annotationconfigvscomponentscan-beans.xml"); UserService userService = context.getBean(UserService.class); AccountService accountService = context.getBean(AccountService.class); Assert.assertNotNull(userService); Assert.assertNotNull(accountService); Assert.assertNotNull(userService.getAccountService()); }
Хм, здесь что-то не так. Похоже, Весна не проводка учетная записьСервис хотя мы аннотировали его @Autowired . Похоже на @Autowired не активен. Для того, чтобы решить эту проблему, мы просто добавим следующую строку поверх нашего файла XML:
4. Активация аннотации <контекстом:компонент-сканирование>
Как похож на <контекст:аннотация-конфиг> , <контекст:компонент-> может распознавать и обрабатывать аннотации инъекций зависимости. Более того, <контекст:компонент-> распознает аннотации фасоли, которые <контекст:аннотация-> не обнаруживает .
В основном, <контекст:компонент-> обнаруживает аннотации путем сканирования пакета . Говоря иначе, он говорит Весна, какие пакеты должны быть отсканированы, чтобы искать аннотированные бобы или компоненты.
@Component , @Repository , @Service , @Controller , @RestController , и @Configuration несколько из них, которые <контекст:компонент-> может обнаружить .
Теперь давайте посмотрим, как мы можем упростить наш предыдущий пример:
@Component public class UserService { @Autowired private AccountService accountService; }
@Component public class AccountService {}
Вот, @Component аннотация отмечает наши классы как бобы . Теперь мы можем очистить все определения фасоли из нашего файла XML. И, конечно, мы должны держать <контекст:> на нем:
Наконец, отметим, что Spring будет искать аннотированные бобы и зависимости под пакетом, указанным базовый пакет атрибут.
5. Заключение
В этом учебнике мы рассмотрели различия между <контекст:аннотация-конфиг> и <контекст:компонент-сканирование> .
Образцы кода, как всегда, более на GitHub .