TL; DR
Анотація @Autowired позбавляє вас від необхідності робити електропроводку у файлі XML (чи будь-яким іншим способом) і просто знаходить для вас, що потрібно вводити куди, і робить це для вас.
Повне пояснення
@AutowiredАнотацій дозволяє пропускати конфігурації в іншому місці , що вводити і просто робить це для вас. Припустимо, що com.mycompany.moviesви маєте пакет, ви повинні помістити цей тег у свій XML (контекстний файл програми):
<context:component-scan base-package="com.mycompany.movies" />
Цей тег виконає автоматичне сканування. Якщо припустити, що кожен клас, який повинен стати квасолею, позначається правильною анотацією, як-от @Component(для простого квасолі) або @Controller(для керування сервлетом) або @Repository(для DAOкласів), і ці класи десь під пакетом com.mycompany.movies, Весна знайде все це і створить квасоля для кожного. Це робиться в 2 сканування класів - перший раз він просто шукає класи, які повинні стати бобом, і картографує ін'єкції, які йому потрібно робити, а під час другого сканування вводить боби. Звичайно, ви можете визначити свої квасолі в більш традиційному XML-файлі або за допомогою класу @Configuration (або будь-якої комбінації трьох).
В @Autowiredанотації йдеться про весну, де потрібно зробити ін'єкцію. Якщо ви покладете його на метод, setMovieFinderвін зрозуміє (за префіксом set+ @Autowiredанотацією), що боб потрібно вводити. У другому скануванні Spring шукає квасоля типу MovieFinder, і якщо вона знайде таку квасолю, вона вводить її в цей метод. Якщо ви знайдете дві такі квасолі, ви отримаєте Exception. Щоб уникнути цього Exception, ви можете використовувати @Qualifierанотацію та сказати, яку з двох бобів ввести наступним чином:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Або якщо ви вважаєте за краще оголосити боби у своєму XML, це виглядатиме приблизно так:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
У @Autowiredдекларації вам також потрібно додати, @Qualifierщоб сказати, яку з двох кольорових бобів ввести:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Якщо ви не хочете використовувати два анотації (і @Autowiredі @Qualifier), ви можете використовувати їх @Resourceдля поєднання:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
@Resource(Ви можете прочитати деякі додаткові дані про нього в перший коментар на цю відповідь) позбавляє вас використання двох анотацій і замість того, щоб використовувати тільки один.
Я просто додам ще два коментарі:
- Доброю практикою було б використовувати
@Injectзамість цього, @Autowiredоскільки воно не є специфічним для весни та є частиною JSR-330стандарту .
- Ще однією хорошою практикою було б поставити
@Inject/ @Autowiredна конструктор замість методу. Якщо ви покладете його на конструктор, ви можете перевірити, що введена квасоля не є нульовою та швидко виходить з ладу при спробі запуску програми та уникає, NullPointerExceptionколи вам потрібно фактично використовувати боб.
Оновлення : Щоб завершити малюнок, я створив нове запитання про @Configurationклас.