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
клас.