Рубрики
Без рубрики

Разница между <контекстом:аннотация-конфиг> против <контекста:компонент-сканирование>

Исследуйте различия между и .

Автор оригинала: baeldung.

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 .