TL; DR
Аннотация @Autowired избавляет вас от необходимости самостоятельно выполнять разводку в файле XML (или любым другим способом) и просто находит для вас, что нужно вводить, куда и делает это для вас.
Полное объяснение
@AutowiredАннотаций позволяет пропускать конфигурации в другом месте , что вводить и просто делает это для вас. Предполагая, что ваш пакет - com.mycompany.moviesвы должны поместить этот тег в ваш XML (файл контекста приложения):
<context:component-scan base-package="com.mycompany.movies" />
Этот тег выполнит автоматическое сканирование. Предполагая, что каждый класс, который должен стать компонентом, помечается правильной аннотацией, например @Component(для простого компонента) или @Controller(для элемента управления сервлета) или @Repository(для DAOклассов), и эти классы находятся где-то в пакете com.mycompany.movies, Spring найдет все это и создаст боб для каждого. Это делается в 2 сканированиях классов - в первый раз он просто ищет классы, которые должны стать бином, и отображает инъекции, которые он должен делать, а во втором сканировании он вводит бины. Конечно, вы можете определить ваши bean-компоненты в более традиционном XML-файле или с помощью класса @Configuration (или любой их комбинации).
@AutowiredАннотаций сообщает Spring , где инъекции должно произойти. Если вы помещаете его в метод, setMovieFinderон понимает (по префиксу set+ @Autowiredаннотации), что бин должен быть введен. Во втором сканировании Spring ищет bean-компонент типа MovieFinder, и если он находит такой bean-компонент, он внедряет его в этот метод. Если он найдет два таких боба, вы получите Exception. Чтобы избежать этого Exception, вы можете использовать @Qualifierаннотацию и сообщить ей, какой из двух bean-компонентов нужно внедрить, следующим образом:
@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потому что это не зависит от Spring и является частью JSR-330стандарта .
- Еще одна хорошая практика - помещать
@Inject/ @Autowiredна конструктор вместо метода. Если вы поместите его в конструктор, вы можете проверить, что введенные bean-компоненты не равны NULL и быстро перестают работать, когда вы пытаетесь запустить приложение и избегать того, NullPointerExceptionкогда вам действительно нужно использовать bean-компонент.
Обновление : чтобы завершить картину, я создал новый вопрос о @Configurationклассе.