Как следует из названия, инъекция аннотации состоит в том, чтобы реализовать инъекцию посредством аннотаций. Обычные аннотации, связанные с пружиной и инъекцией, включают в себя автоматическую, ресурс, квалификатор, сервис, контроллер, репозиторий и компонент.
Autowovired - это автоматическая инъекция, автоматически находит соответствующий боб из контекста пружины до инъекции
Ресурс используется для указания введения имени
Квалификатор и автоматическая работа работают вместе, чтобы указать название боба
Сервис, контроллер и репозиторий соответственно отмечают класс как класс уровня обслуживания, класс уровня контроллера и класс хранения данных. При конфигурации аннотации Spring Scan, эти классы будут помечены для создания бобов.
Компонент является общим термином. Занятия маркировки являются компонентами. Когда пружинные сканирования и конфигурации аннотаций эти классы будут помечены для создания бобов.
Spring поддерживает множественные методы аннотации для впрыскивания зависимости бобов:
@Resource javax.annotation JSR250 (общие аннотации для Java) @Inject javax.inject jsr330 (инъекция зависимости для Java) @autowired org.springframework.bean.Factory Spring Spring
Интуитивно, @autowired-это аннотация, предоставленная весной, а другие-встроенные аннотации самой JDK, а Spring также поддерживает эти аннотации. Но в чем разница между этими тремя при использовании? После тестирования метода автор обнаружил несколько интересных функций.
Разница суммирована следующим образом:
1. @autowired имеет требуемое свойство, которое можно настроить как false. В этом случае, если соответствующий фасоль не найден, исключение не будет брошено. @Inject и @Resource не предоставляют соответствующие конфигурации, поэтому вы должны найти их в противном случае исключение.
2. @autowired и @Inject в основном одинаковы, потому что оба используют AutoWireDannotationBeanpostProcessor для обработки впрыскивания зависимости. Но @Resource является исключением, которое использует CommonAnnotationBeanpostProcessor для обработки впрыска зависимостей. Конечно, оба являются Beanpostprocessors.
@Autowired и @Inject - по умолчанию AutoWailired по типу - AutoWailired по имени квалификатора может быть явно указана через @qualifier. - Если автоматическое сбое по типу (не найдено или обнаружено несколько реализаций), дегенераты на автоматическое имя по поле @Resource - По умолчанию по умолчанию по имени поля - если автоматическое имя поля не удастся, дегенератизируется на автоматические поля - тип - Автопроизводимый по квалификационному имени может быть явно определено через @qualifier - если автоатоу -названия с невыполнены именем поля. Но в настоящее время, если автоматическое имя поля не удастся, он больше не будет дегенерировать в AutoWailired по типу.
Советы квалифицированное имя против имени боба
В Spring Design, квалифицированное имя не эквивалентно названию бобов, последнее должно быть уникальным, но первое похоже на функцию тега или группы, классифицируя конкретные бобы. Это может достичь эффекта Getbytag (группа). Для фигурных бобов, конфигурируемых на XML, вы можете указать имя бобов через атрибут ID (если не указано, имя класса по умолчанию), а квалификационное имя указано через тег:
<bean id = "lamborghini"> <Qualifier value = "luxury"/> <!-Введите любые зависимости, требуемые этим бобом-> </bean>
Если это через аннотацию, вы можете указать квалификационное имя через аннотацию @qualifier и указать имя боба через значение @named или @component (@service, @repository и т. Д.):
@Component ("lamborghini") @qualifier ("Luxury") открытый класс Lamborghini реализует автомобиль {}или
@Component @named ("lamborghini") @qualifier ("Luxury") открытый класс Lamborghini реализует автомобиль {}Точно так же, если имя бобов не указано, пружина по умолчанию будет по умолчанию вниз по имени класса (lamborghini => lamborghini).
3. Используйте метод зависимости анотации для выполнения до метода введения XML. Если одновременно используются два метода впрыска от зависимости от одного и того же бобов, то XML предпочтительнее. Тем не менее, я не беспокоюсь о том, что зависимости, вводимые через анотацию, не могут вводить бобы, настроенные в XML. Инъекция зависимости выполняется после регистрации бобов.
4. Текущий метод AutoWailired по типу (автор использует версию 3.2.3.33., внедрение Spring AutoWireDannotationBeanpostProcessor имеет «ошибки», что означает, что @autowired и @Inject имеют подводные камни (называемые ямами, а не ошибки, потому что они, кажется, являются преднамеренными ...). Это ошибка, которая приходит из онлайн, а также является причиной написания статей здесь. Сцена следующая:
Существуют следующие определения в Application-context.xml:
<xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: context = "http://www.springframework.org/schema/context" xmlns: util = "http://www.springframework.orshema. xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.spramework.org/schema/aopem http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context/spring-context-3.0.x.x.x.x.x.x.x.x.x.spramework.org/schema/context/spring-3.0.x.x.x.x.x.x. http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-ut-2.5.5..> <Контекст: Annotation-config /> <context: component-scan base-package = "me.arganzheng.study" /> <util: constant id = "en" static-field = "me.arganzheng.study.spring.autowired.constants.language.en" /> <util: constant id = "ja" static-field = "me.arganzheng.study.spring.autowired.constants.language.jp" /> <util: constant id = "ind" static-field = "me.arganzheng.study.spring.autowired.constants.language.ind" /> <util: constant id = "pt" static-field = "me.arganzheng.study.spring.autowired.constants.language.pt" /> <util: constant id = "th" static-field = "me.arganzheng.study.spring.autowired.constants.language.th" /> <util: constant id = "ar" static-field = "me.arganzheng.study.spring.autowired.constants.language.ar" /> <util: constant id = "en-rin" static-field = "me.arganzheng.study.spring.autowired.constants.language.en_rin" /> <util: map = "lomangehach-cheam-cheam-cheam-cheam-cheam-cheam-cheam-cheam-cheam-cheam. key-type="java.lang.String" value-type="java.lang.String"> <entry key="pt" value="pt" /> <entry key="br" value="pt" /> <entry key="jp" value="ja" /> <entry key="ja" value="ja" /> <entry key="ind" value="ind" /> <entry key="id" value="ind" /> <entry key="en-rin" value="en-rIn" /> <entry key="in" value="en-rIn" /> <entry key="en" value="en" /> <entry key="gb" value="en" /> <entry key="th" value="th" /> <entry key="ar" value="ar" /> <entry key="eg" value="ar" /> </util: map> </beans>
Константы, примененные статическим полем, определены в следующем классе:
Пакет me.arganzheng.study.spring.autowired; Константы публичного интерфейса {public interface language {public static final String en = "commonconstants.lang_english"; Общественная статическая конечная строка jp = "commonconstants.lang_japanese"; Общественная статическая конечная строка ind = "commonconstants.lang_indonesian"; публичная статическая конечная строка pt = "commonconstants.lang_portuguese"; Общественная статическая конечная строка th = "commonconstants.lang_thai"; Public Static Final String en_rin = "commonconstants.lang_english_india"; Общественная статическая конечная строка ar = "commonconstants.lang_arabic"; }}Затем, если мы объявим зависимость в коде следующим образом:
открытый класс AutoWireDTest Extends BasesPringTestCase {@Autowired Private Map <String, String> LanguageCheChangesMap; @Test public void testautowired () {notnull (languageChangesMap); System.out.println (languagechangesmap.getClass (). GetSiMplename ()); System.out.println (LanguageChangesMap); }}Угадай, что, что -то странное случилось!
Результаты работы следующие:
LinkedHashmap {en = commonConstants.lang_English, ja = commonconstants.lang_japanese, ind = commonconstants.lang_indonesian, pt = commonconstants.lang_portuguesТо есть карта
Серьезно: завоеванное исключение, разрешая TestexeCutionListener
[org.springframework.test.context.support.dependencyInctionteStexeCutionListener@5c51ee0a] для подготовки экземпляра тестирования [me.arganzheng.study.spring.autowired.autowiredtest@6e301e0] org.spramework.beansceptoration. 'me.arganzheng.study.spring.autowired.autowiredTest': инъекция зависимости от автоматической интенсивности провалилась; Вложенное исключение - org.springframework.beans.factory.beancreationexception: не удалось. Вложенное исключение - org.springframework.beans.factory.nosuchbeandefinitionException: нет квалифицированного боба типа [java.lang.string] для зависимости [карта с типом значения java.lang.string]: ожидается не менее 1 боба, которая соответствует кандидату на аутовиле для этой зависимости. Аннотации зависимости: {@org.springframework.beans.factory.annotation.autowired (обязательно = true)} ... ed: org.springframework.beans.factory.nosuchbeandefinitionExcept квалифицируется в качестве кандидата в автоотату для этой зависимости. Аннотации зависимости: {@org.springframework.beans.factory.annotation.autowired (обязательно = true)} at org.springframework.beans.factory.support.default -letristablebeanfactory.raisenosuchbeandefinationexexexect org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency (default letristbeanfactory.java:843) на org.springframework.beans.factory.support.defaultablebeanfactory.ResolveDependence (defaultBeanfactable.jefaultablebeanfactory.Resolvendency (defaultBeanfactable.jefaultablebeanfore.Resolvendency. org.springframework.beans.factory.annotation.autowiredantationbeanpostprocessor $ autowiredfieldelement.inject (AutowireDantationBeanpostProcessor.java:486) ... 28Я отлаживал это и обнаружил, что весной это действительно ошибка. Существует проблема с этим методом в default -listablebeanfactory:
Защищенный объект doresolvedependency (дескриптор зависимости descriptor, класс <?> Тип, String beanname, Set <string> AutoWireDbeanNames, TypeConverter TypeConverter) Throws Beansexception {... else if (map.cassignablefrom (type) && type.isInterface ()) {class <? descriptor.getmapkeytype (); if (keytype == null ||! string.class.isassignablefrom (keytype)) {if (descriptor.isrequired ()) {throw new fatalbeanexception ("тип ключа [" + keytype + "] map [ + type.getname () +"] должен быть назначен [Java.lang. } return null; } Class <?> Valuetype = descriptor.getMapvalueType (); if (valuetype == null) {if (descriptor.isrequired ()) {бросить новое FatalbeanException («Тип значения не объявлен для map [" + type.getName () + "]"); } return null; } Map <string, object> matchingbeans = findautowireCandidates (beanname, valuetype, дескриптор); if (matchbeans.isempty ()) {if (descriptor.isrequired ()) {raisenosuchbeandefinitionexception (valuetype, «карта с типом значения» + valuetype.getName (), descriptor); } return null; } if (AutoWireDBeanNames! = null) {AutoWireDbeanNames.Addall (matchbeans.keyset ()); } вернуть сопоставление бобов; } ...}Ключ - это предложение: карта
Серьезно: завоеванное исключение, разрешая TestexeCutionListener
[org.springframework.test.context.support.dependencyInectionTeStexeCutionListener@9476189] подготовить экземпляр тестового экземпляра [me.arganzheng.study.spring.autowired.autowiredtest@2d546e21] ... вызвано: org.springframework.beans.factory.nosuchbeandefinitionException: нет квалификационного боба типа [java.lang.string], найденный для зависимости [карта с типом значения java.lang.string]: ожидается, по крайней мере, 1 боб, который претендует в качестве кандидата в автооверию для этой зависимости. Аннотации зависимости: { @org.springframework.beans.factory.annotation.autowired (required = true), @org.springframework.beans.factory.annotation.qualifier (value = languageChangeSmap)} org.springframework.beans.factory.support.defaultlistablebeanfactory.raisenosuchbeandefinitionException (default lectablebeanfactory.java:986) на org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency (default letristbeanfactory.java:843) на org.springframework.beans.factory.support.defaultablebeanfactory.ResolveDependence (defaultBeanfactable.jefaultablebeanfactory.Resolvendency (defaultBeanfactable.jefaultablebeanfore.Resolvendency. org.springframework.beans.factory.annotation.autowiredantationbeanpostprocessor $ autowiredfieldelement.inject (AutowireDantationBeanpostProcessor.java:486) ... 28После отладки я обнаружил, что путь выполнения такой же, как имен Qualfie, не указанное. Разве вы не указали имя боба? Почему это все еще автозагодно по типу? После более внимательного взгляда я узнал. Метод DoReSolveDependency для default -stistableBeanFactory делает разницу между типами в первую очередь:
Защищенный объект doresolvedependency (дескриптор зависимости, класс <?> Тип, Строка Beanname, Set <string> AutoWiredBeanNames, TypeConverter TypeConverter) Throws Beansexception {object value = getautowirecandateresolver (). GetSuggestedValue (decriptor); if (value! = null) {if (vancementOf string) {string strval = resulectembeddedValue (((String) value); Beandefinition bd = (beanname! = Null && содержит bean (beanname)? Getmergedbeandefinition (Beanname): NULL); value = evaluateBeanDefinitionString (Strval, BD); } TypeConverter Converter = (TypeConverter! = NULL? TypeConverter: getTypeConverter ()); return (descriptor.getfield ()! = null? } if (type.isArray ()) {class <?> componenttype = type.getComponentType (); Map <String, Object> Matchbeans = findAutowireCandidates (Beanname, ComponentyPe, дескриптор); if (matchingbeans.isempty ()) {if (descriptor.isrequired ()) {raisenosuchbeandefinitionexception (componentype, «массив» + componentype.getname (), descriptor); } return null; } if (AutoWireDBeanNames! = null) {AutoWireDbeanNames.Addall (matchbeans.keyset ()); } TypeConverter Converter = (TypeConverter! = NULL? TypeConverter: getTypeConverter ()); return converter.convertifnecessary (matchingbeans.values (), type); } else if (collection.class.isassignablefrom (type) && type.isinterface ()) {class <?> elementtype = descriptor.getCollectionType (); if (elementtype == null) {if (descriptor.isrequired ()) {бросить новое FatalbeanException ("Тип элемента не объявлен для collection [" + type.getName () + "]"); } return null; } Map <String, Object> MatchingBeans = findAutowiReCandidates (BeanName, ElementType, Descriptor); if (matchingbeans.isempty ()) {if (descriptor.isrequired ()) {raisenosuchbeandefinitionException (elementType », коллекция« + elementType.getName (), descriptor); } return null; } if (AutoWireDBeanNames! = null) {AutoWireDbeanNames.Addall (matchbeans.keyset ()); } TypeConverter Converter = (TypeConverter! = NULL? TypeConverter: getTypeConverter ()); return converter.convertifnecessary (matchingbeans.values (), type); } else if (map.class.isassignablefrom (type) && type.isinterface ()) {class <?> keytype = descriptor.getmapkeytype (); if (keytype == null ||! string.class.isassignablefrom (keytype)) {if (descriptor.isrequired ()) {throw new fatalbeanexception ("тип ключа [" + keytype + "] map [ + type.getname () +"] должен быть назначен [Java.lang. } return null; } Class <?> Valuetype = descriptor.getMapvalueType (); if (valuetype == null) {if (descriptor.isrequired ()) {бросить новое FatalbeanException («Тип значения не объявлен для map [" + type.getName () + "]"); } return null; } Map <string, object> matchingbeans = findautowireCandidates (beanname, valuetype, дескриптор); if (matchbeans.isempty ()) {if (descriptor.isrequired ()) {raisenosuchbeandefinitionexception (valuetype, «карта с типом значения» + valuetype.getName (), descriptor); } return null; } if (AutoWireDBeanNames! = null) {AutoWireDbeanNames.Addall (matchbeans.keyset ()); } вернуть сопоставление бобов; } else {map <string, object> matchingbeans = findautowirecandidates (beanname, type, descriptor); if (matchbeans.isempty ()) {if (descriptor.isrequired ()) {raisenosuchbeandefinitionException (type, ", Descriptor); } return null; } if (matchbeans.size ()> 1) {string primarybeanname = degineprimaryCandidate (Matchingbeans, Descriptor); if (primaryBeanName == null) {бросить новый NouniqueBeanDefinitionException (type, matchbeans.keyset ()); } if (AutoWireDBeanNames! = null) {AutoWireDBeanNames.Add (PrimaryBeanName); } return matchbeans.get (primaryBeanName); } // У нас есть ровно один матч. Map.Entry <string, object> entry = matchingbeans.EntrySet (). Iterator (). Next (); if (AutoWireDBeanNames! = null) {AutoWireDBeanNames.Add (entry.getKey ()); } return entry.getValue (); }}Если это массив, сбор или карта, автоматическая типа в соответствии с типом элемента в классе коллекции (тип карты использует значение). Почему это так особенное? Оказывается, что весна является для этой цели: позволяет вам вводить все реализации, которые соответствуют типам одновременно, то есть вы можете вводить их так:
@Autowired
частный список <Arze> автомобили;
Если у вашего автомобиля есть несколько реализаций, он будет введен и не будет сообщено снова
org.springframework.beans.factory.nosuchbeandefinitionexception: нет уникального боба типа [me.arganzheng.study.spring.autowired.car] не определено: ожидаемый одиночный подходящий боб, но обнаружил 2: [audi, toyota].
Однако в вышеупомянутом случае, если вы используете @Resource, у вас не будет этой проблемы:
открытый класс AutoWireDTest Extends BasesPringTestCase {@Resource @qualifier ("languageChangesMap") частная карта <String, String> languageChangesMap; @Test public void testautowired () {assertnotnull (languagechangesmap); System.out.println (languagechangesmap.getClass (). GetSiMplename ()); System.out.println (LanguageChangesMap); }}Нормальная работа:
LinkedHashmap {pt = pt, br = pt, jp = ja, ja = ja, ind = ind, id = en, en-rin = en-rin, in = en-rin, en = en, gb = en, th = ar = ar, eg = ar} Конечно, если вы не указаете @qualifier ("languagechangesmap"), а имя поля не является LanguageChangesMap, то та же ошибка все еще будет сообщена.
Вызвано: org.springframework.beans.factory.nosuchbeandefinitionException: нет квалификационного боба типа [java.lang.string], найденный для зависимости [карта с типом значения java.lang.string]: ожидается не менее 1 боба, которая соответствует кандидату на аутовиле для этой зависимости. Аннотации зависимости: {@javax.annotation.resource (shareable = true, mapedname =, description =, name =, type = class java.lang.object, authenticationtype = контейнер, поиск =)} at org.springframework.beans.factory.support.defaultlistablebeanfactory.raisenosuchbeandefinitionException (default lectablebeanfactory.java:986) на org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency (default letristbeanfactory.java:843) на org.springframework.beans.factory.support.defaultablebeanfactory.ResolveDependence (defaultBeanfactable.jefaultablebeanfactory.Resolvendency (defaultBeanfactable.jefaultablebeanfore.Resolvendency. org.springframework.context.annotation.commonannotationbeanpostprocessor.autowireresource (commonannotationbeanpostprocessor.java:438) на org.springframework.context.annotation.commonannotationbeanpostprocessor.getresource (commonannotationbeanpostprocessor. org.springframework.context.annotation.commonannotationbeanpostprocessor $ resourceelement.getresourcetoinject (commonannotationbeanpostprocessor.java:550) на org.springframework.beans.factory.annotation.incectionMetaDate $ injectedelement.injure org.springframework.beans.factory.annotation.incementmetadata.inject (incectionMetadata.java:87) на org.springframework.context.annotation.commonannotationbeanpostprocessor.3Кроме того, @Resource может также реализовать список выше для получения всех реализаций:
открытый класс AutoWireDTest Extends BasesPringTestCase {@Resource @qualifier ("languageChangesMap") частная карта <String, String> languageChangesMap; @Resource Private List <Ar> Cars; @Test public void testautowired () {assertnotnull (languagechangesmap); System.out.println (languagechangesmap.getClass (). GetSiMplename ()); System.out.println (LanguageChangesMap); assertnotnull (автомобили); System.out.println (cars.getClass (). GetSiMplename ()); System.out.println (CARS); }}Работа правильно:
LinkedHashmap {pt = pt, br = pt, jp = ja, ja = ja, ind = ind, id = en, en-rin = en-rin, in = en-rin, en = en, gb = en, th = ar = ar, eg = ar} arraylist [me.arganzheng.study.spring.autowired.audi@579584da, me.arganzheng.study.spring.autowired.toyota@19453122]
Это связано с тем, что аннотация @Resource использует процессор CommonAnnotationBeanpostProcessor, который не тот же автор, как AutoWireDannotationBeanpostProcessor [/smile]. Я не буду анализировать это здесь. Заинтересованные студенты могут прочитать код и изучить его самостоятельно.
Окончательный вывод заключается в следующем :
1. @autowired и @Inject
Autowailired по типу может быть четко указан @qualifier (класс не собирания. Примечание: не автоматически по названию бобов!)
Если сбое с автоматическим типом (не найдено или обнаружено несколько реализаций), дегенератируется на автобурирован по имени поля (класс не собирания)
2. @Resource
По умолчанию Autowailired по имени поля
Если автоматическое имя поля не удалось, он вырождается в автобусов
Autowailired по квалификационному имени можно явно указано через @qualifier
Если автоматическая квалификационная имени не удастся, он вырождается в автоматическое название поля. Однако, если автоматическое имя поля не удастся, он больше не будет дегенерировать в AutoWailired по типу. Тестовый проект сохраняется на GitHub. Это стандартный проект Maven. Заинтересованные студенты могут клонировать его на местном уровне, чтобы запустить тест.
Пополнить
Коллега отметил, что в официальном документе весны есть предложение, которое противоречит моим отношениям:
Однако, хотя вы можете использовать это соглашение для обозначения конкретных бобов по имени, @Autowired в основном касается инъекции, управляемой типом, с дополнительными семантическими квалификациями. Это означает, что квалификационные значения, даже при запасении имени бобов, всегда имеют сужение семантики в наборе матчей типов; Они не семантически выражают ссылку на уникальный идентификатор бобов.
Другими словами, даже если @Autowired добавлено с аннотацией @qualifier, на самом деле он является автоматическим типом. @Qualifier - просто квалификатор, просто условие фильтра. Я следил за кодом и обнаружил, что это действительно так. Это название @qualifier, разработанное весной, не эквивалентно названию бобов. Он немного похож на тег. Однако, если этот тег уникален, то эффект фактически эквивалентен названию бобов. С точки зрения реализации, Spring First Getbytype, получите списки кандидатов, а затем отфильтруйте в соответствии с именем квалификатора.
Определите еще один Lamborghini, здесь указан с использованием @qualifier:
Пакет me.arganzheng.study.spring.autowired; Импорт org.springframework.beans.factory.annotation.qualifier; Import org.springframework.stereotype.component; @Component @qualifier ("Luxury") открытый класс Lamborghini реализует автомобиль {}Определите другой Rolls-Royce, здесь он намеренно указан с помощью @named:
Пакет me.arganzheng.study.spring.autowired; Импорт javax.inject.named; Import org.springframework.stereotype.component; @Component @named ("Luxury") открытый класс RollsRoyce реализует автомобиль {} Проверьте роскошный автомобиль с инъецированным определением:
Пакет me.arganzheng.study.spring.autowired; импорт static junit.framework.assert.assertnotnull; импортировать java.util.list; импортировать me.arganzheng.study.basespringtestcase; Импорт org.junit.test; Импорт org.springframework.beans.factory.annotation.autowired; Импорт org.springframework.beans.factory.annotation.qualifier; / ** * * @author Zhengzhibin * */ public class AutoWireDTest Extends BasespringTestCase {@autowired @qualifier ("Luxury") частный список <Ar> LuxuryCars; @Test public void testautowired () {assertnotnull (LuxuryCars); System.out.println (LuxuryCars.getClass (). GetSiMplename ()); System.out.println (LuxuryCars); }}Результаты работы следующие:
Arraylist [me.arganzheng.study.spring.autowired.lamborghini@66b875e1, me.arganzheng.study.spring.autowired.rollsroyce@584433b76]
Дополнение: автоматические режимы
Spring поддерживает четыре режима Autowire. При использовании методов конфигурации XML вы можете указать их через атрибут Autowire.
нет. (По умолчанию) Нет автопроизводства. Ссылки на бобов должны быть определены через реф. Изменение настройки по умолчанию не рекомендуется для более крупных развертываний, поскольку определение сотрудников явно дает больший контроль и ясность. В некоторой степени он документирует структуру системы. биография. Аутовизация по названию свойства. Весна ищет боб с тем же именем, что и свойство, которое должно быть автоматизировано. Например, если определение бобов установлено на Autowire по имени, и оно содержит мастер -свойство (то есть, оно имеет метод SetMaster (..)), Spring ищет определение бобов с именем Master и использует его для установки свойства. байт. Позволяет автопроизводить, если в контейнере существует именно один бон типа свойства. Если существует более одного, выброшено фатальное исключение, что указывает на то, что вы не можете использовать автоматическое создание байтипов для этого боба. Если нет соответствующих бобов, ничего не происходит; свойство не установлено. конструктор. Аналогично байтию, но применима к аргументам конструктора. Если в контейнере не совсем один боб типа аргумента конструктора, выдвигается фатальная ошибка.
Если вы используете аннотации @Autowired, @Inject или @Resource, это будет немного сложнее, и будет пройден неудачный процесс деградации, и будет введен квалификатор. Но основной принцип такой же.