Разница между vs

1. Обзор

В этом руководстве мы узнаем о различиях между двумя основными элементами конфигурации XML в Spring: и .

2. Определения компонентов

Как мы все знаем, Spring предоставляет нам два способа определения наших bean-компонентов и зависимостей: конфигурация XML и аннотации Java. Мы также можем разделить аннотации Spring на две группы: аннотации внедрения зависимостей и аннотации bean-компонентов.

До аннотаций нам приходилось вручную определять все наши bean-компоненты и зависимости в файлах конфигурации XML. Теперь, благодаря аннотациям Spring, он может автоматически обнаруживать и связывать за нас все наши bean-компоненты и зависимости . Итак, мы можем по крайней мере исключить XML, необходимый для bean-компонентов и зависимостей.

Однако мы должны помнить, что аннотации бесполезны, если мы их не активируем . Чтобы активировать их, мы можем добавить либо или же поверх нашего XML-файла.

В этом разделе мы увидим, как и отличаются друг от друга способами активации аннотаций.

3. Активация аннотации с помощью < context: annotation-config>

В аннотации в основном используются для активации аннотаций внедрения зависимостей. @Autowired , @Qualifier , @PostConstruct , @PreDestroy и @Resource - вот некоторые из тех, которыеможет решить.

Давайте сделаем простой пример, чтобы увидеть, как может упростить нам конфигурацию XML.

Сначала создадим класс с полем зависимости:

public class UserService { @Autowired private AccountService accountService; }
public class AccountService {}

Теперь давайте определим наши бобы.

Прежде чем продолжить, отметим, что нам все еще нужно объявить bean-компоненты в XML. Это потому, чтоактивирует аннотации только для bean-компонентов, уже зарегистрированных в контексте приложения .

Как можно видеть здесь, мы аннотированный AccountService поле с помощью @Autowired . @Autowired сообщает Spring, что это поле является зависимостью, которая должна быть автоматически подключена соответствующим bean-компонентом.

Если бы мы не использовали @Autowired , нам нужно было бы вручную установить зависимость accountService :

Теперь мы можем ссылаться на наши bean-компоненты и зависимости в модульном тесте:

@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()); }

Хм, здесь что-то не так. Похоже, Spring не подключает accountService, хотя мы аннотировали его @Autowired . Похоже, что @Autowired неактивен . Чтобы решить эту проблему, мы просто добавим следующую строку поверх нашего XML-файла:

4. Активация аннотации < context: component-scan>

Подобно , также может распознавать и обрабатывать аннотации внедрения зависимостей. Более того, распознает аннотации bean, которые не обнаруживает .

В принципе, обнаруживает аннотации путем сканирования пакетов . Другими словами, он сообщает Spring, какие пакеты необходимо сканировать для поиска аннотированных bean-компонентов или компонентов.

@Component , @Repository , @Service , @Controller , @RestController и @Configuration - это те, которыеможно обнаружить .

Теперь давайте посмотрим, как мы можем упростить наш предыдущий пример:

@Component public class UserService { @Autowired private AccountService accountService; } 
@Component public class AccountService {}

Здесь аннотация @Component помечает наши классы как beans . Теперь мы можем удалить все определения bean-компонентов из нашего XML-файла. И, конечно, нам нужно сохранить на нем:

Наконец, отметим, что Spring будет искать аннотированные bean-компоненты и зависимости в пакете, указанном атрибутом base-package .

5. Заключение

В этом уроке мы рассмотрели различия между и .

Примеры кода, как всегда, есть на GitHub.