Разлика между vs.

1. Общ преглед

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

2. Определения на боб

Както всички знаем, Spring ни предоставя два начина да дефинираме нашите компоненти и зависимости: XML конфигурация и Java анотации. Също така можем да категоризираме анотациите на Spring в две групи: анотации за инжектиране на зависимости и анотации на боб.

Преди анотациите трябваше да дефинираме ръчно всички наши компоненти и зависимости в XML конфигурационни файлове. Сега, благодарение на анотациите на Spring, той може автоматично да открива и свързва всички наши зърна и зависимости за нас . И така, можем поне да премахнем XML, необходим за боб и зависимости.

Трябва обаче да помним, че анотациите са безполезни, освен ако не ги активираме . За да ги активираме, можем да добавим и двете или отгоре на нашия XML файл.

В този раздел ще видим как и се различават помежду си по отношение на начините им на активиране на анотациите.

3. Активиране на анотации от < context: annotation-config>

The анотацията се използва главно за активиране на анотациите за инжектиране на зависимост. @Autowired , @Qualifier , @PostConstruct , @PreDestroy и @Resource са някои от тези, коитоможе да разреши.

Нека направим прост пример, за да видим как може да опрости XML конфигурацията за нас.

Първо, нека създадем клас с поле за зависимост:

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

Сега, нека дефинираме нашия боб.

Преди да продължим по-нататък, нека посочим, че все още трябва да декларираме фасул в XML. Това е такаактивира поясненията само за зърната, вече регистрирани в контекста на приложението .

Както може да се види тук, ние обозначили accountService областта използване @Autowired . @Autowired казва на Spring, че това поле е зависимост, която трябва да бъде автоматично свързана от съответстващ боб.

Ако не сте използвали @Autowired , тогава ние ще трябва да зададете accountService зависимостта ръчно:

Сега можем да се позовем на нашите зърна и зависимости в единичен тест:

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

Хм, тук нещо не е наред. Тя изглежда като пролет не е окабеляване accountService въпреки че ние го пояснителни бележки @Autowired . Изглежда, че @Autowired не е активен. За да разрешим този проблем, просто ще добавим следния ред отгоре на нашия XML файл:

4. Активиране на анотации чрез < context: component-scan>

Като подобен на , може да разпознава и обработва и анотациите за инжектиране на зависимости. Освен това, разпознава анотации на боб, които не открива .

По принцип, открива анотациите чрез сканиране на пакети . Казано по различен начин, той казва на Spring кои пакети трябва да бъдат сканирани, за да се търсят коментираните зърна или компоненти.

@Component , @Repository , @Service , @Controller , @RestController и @Configuration са няколко такива, коитоможе да открие .

Сега нека видим как можем да опростим нашия предишен пример:

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

Тук анотацията @Component маркира нашите класове като боб . Сега можем да изчистим всички дефиниции на боб от нашия XML файл. И разбира се, трябва да запазим на всичко отгоре:

И накрая, нека отбележим, че Spring ще търси коментираните компоненти и зависимости в пакета, посочен от атрибута base-package .

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

В този урок разгледахме разликите между и .

Кодовите проби, както винаги, са приключили на GitHub.