основное введение
В Spring мы можем использовать следующие три автосвязанные аннотации для внедрения зависимостей:
| аннотация | Где пакет | источник |
|---|---|---|
| @Autowired | org.springframework.beans.factory.annotation.Autowired | Собственные аннотации Spring |
| @Resource | javax.annotation.Resource | Аннотации стандарта JSR-250 |
| @Inject | javax.inject.Inject | Аннотации стандарта JSR-330 |
-
По умолчанию аннотация @Autowired собирает зависимые объекты по типу (byType).По умолчанию требуется, чтобы зависимый объект существовал.Если соответствующий bean-компонент не найден, IOC-контейнер сообщит об ошибке. Однако у @Autowired есть обязательный атрибут, для которого можно установить значение false.Если для него установлено значение false, то при отсутствии соответствующего bean-компонента будет введено значение null, и система не выдаст ошибку. Если мы хотим использовать сборку по имени (byName), мы можем использовать ее вместе с аннотацией @Qualifier.
-
@Resource собирает зависимые объекты по имени (byName) по умолчанию, которое предоставляется JAVAEE и требует импорта пакета javax.annotation.Resource. @Resource имеет два важных атрибута: name и type, и Spring разрешает атрибут name аннотации @Resource к имени bean-компонента, а атрибут type разрешает тип bean-компонента. Таким образом, если используется атрибут name, используется стратегия автоматического внедрения byName, а стратегия автоматического внедрения byType используется при использовании атрибута type. Если не указано ни имя, ни атрибут типа, стратегия будет автоматически внедрена с использованием byName через механизм отражения.
-
Аннотация @INJECT. Annotation @Inject не имеет необходимых атрибутов, поэтому, если не будет зависеть от подходящей системы, будет ввести ошибку сбой. Использовать @inject Нужна добавить следующую зависимость:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Принцип реализации
Процессор аннотаций
Во внутренней реализации среды Spring внедрение реализации аннотаций в основном осуществляется через класс реализации интерфейса BeanPostPocessor постпроцессора компонента. Постпроцессор BeanPostProcessor выполняется сразу после создания экземпляра объекта bean при запуске контейнера Spring, обрабатывая экземпляр объекта bean.
-
@Autowired реализует внедрение зависимостей объектов bean-компонентов в другие объекты bean-компонентов через класс реализации AutowiredAnnotationBeanPostProcessor интерфейса BeanPostProcessor;
-
@Resource и @Inject реализуются классом реализации CommonAnnotationBeanPostProcessor интерфейса BeanPostProcessor. Как следует из названия, это общедоступная аннотация CommonAnotation. CommonAnnotationBeanPostProcessor — это BeanPostProcessor в Spring, который единообразно обрабатывает аннотации, определенные в JDK. Аннотации, которые будет обрабатывать этот класс, также включают @PostConstruct, @PreDestroy и т. д.
Условия активации процессора аннотаций
Условия AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor и добавленные в контейнер условия BeanPostProcessor Spring, т.е. активация этих процессоров, следующие:
1. Конфигурация Spring на основе XML
В XML-файл конфигурации соответствующего контейнера Spring, например applicationContext.xml, добавьте
2. Конфигурация Spring на основе класса конфигурации
Если Spring настроен на основе класса конфигурации вместо applicationContext.xml, такого как SpringBoot, контейнер IOC, используемый внутри, реализуется как AnnotationConfigApplicationContext или его производный класс, а вышеупомянутый BeanPostProcessor будет автоматически создан и активирован внутри AnnotationConfigApplicationContext. Если есть как конфигурация на основе XML, так и конфигурация класса конфигурации, а также с точки зрения времени внедрения, внедрение на основе аннотаций предшествует внедрению на основе XML, поэтому внедрение на основе XML переопределит внедрение на основе аннотаций.
Сходства и различия трех аннотаций
- @Autowired поставляется с Spring, @Inject и @Resource предоставляются JDK, где @Inject — это реализация спецификации JSR330, а @Resource — реализация спецификации JSR250.
- @Autowired и @Inject в основном одинаковы, потому что оба используют AutowiredAnnotationBeanPostProcessor для обработки внедрения зависимостей. Но @Resource отличается, он использует CommonAnnotationBeanPostProcessor для обработки внедрения зависимостей. Конечно, оба являются BeanPostProcessors.
- Основное различие между @Autowired и @Inject заключается в том, что @Autowired может установить для требуемого свойства значение false, а @Inject не имеет этой опции.
- @Resource вводится в соответствии с byName по умолчанию, а @Autowired и @Inject вводятся в соответствии с byType по умолчанию.
- @Autowired указывает внедрение определенного bean-компонента через @Qualifier, @Resource может указать bean-компонент внедрения через имя параметра, а @Inject требует аннотации @Named для указания bean-компонента внедрения.