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.