Spring Series Seven: Spring Autowiring

Spring
Spring Series Seven: Spring Autowiring

Когда мы встретимся? Смущен в это время и ночь.

Обзор

существуетSpringframework, объявленный в конфигурационном файлеbeanзависимости является хорошей практикой, потому чтоSpringКонтейнеры способны к совместной автоматической сборкеbeanОтношения между. это называетсяspringАвтопроводка.

自动装配功能具有四种模式。 Бытьno,byName,byTypeиconstructor.

Автоматическое определение другого режима автоматического подключения устарело.DocsСказатьautodetectслишком много вариантовmagic, желательно с более явным утверждением.

  • XMLРежим автопроводки по умолчанию в конфигурацииno.
  • JavaРежим автопроводки по умолчанию в конфигурацииbyType.

https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/10/23/16df66e3a65bb570~tplv-t2oaga2asx-image.image
https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/10/23/16df66e3a65bb570~tplv-t2oaga2asx-image.image

Режим автопроводки

  1. noВариантspringПараметр по умолчанию для фреймворка, означающий, что автоматическое подключение отключено.OFF. мы должны бытьbeanиспользуется в определении<property>Теги явно устанавливают зависимости.
  2. byNameЭта опция включает на основеbeanВнедрение зависимостей по имени. существуетBeanПри автоматическом связывании свойств в , имя свойства используется для поиска в файле конфигурации соответствующегоBeanопределение. Если вы найдете такиеbean, введите его в свойство. Если вы не можете найти такойbean, вылетает ошибка.
  3. byTypeЭтот вариант поддерживает на основеbeanтип внедрения зависимости. существуетbeanПри автоматическом подключении свойства в , тип класса свойства используется для поиска в файле конфигурации соответствияbeanопределение. Если вы найдете такойbeanВнедрите его в свойство. Если вы не найдете этоbean, Выдает ошибку.
  4. constructorАвтопроводка через конструктор сbyTypeАналогично, работает только для параметров конструктора. с включенной автоподстройкойbean, он будет искать тип класса параметров конструктора, а затем выполнять автосвязывание типов для всех параметров конструктора. Обратите внимание, что если ни один из контейнеров полностью не относится к типу параметра конструктораbean, выдается фатальная ошибка.

@Autowiredаннотация

КромеbeanВ дополнение к режиму автопроводки, предоставленному в файле конфигурации, вы также можете использовать@AutowiredАннотировано вbeanАвтопроводка указана в классе. быть вbeanиспользуется в классе@AutowiredДля автоматической инъекции вы должны сначала использовать следующую конфигурацию вspringВ приложении включена автоматическая инъекция.

Включить настройку аннотаций
<context:annotation-config />

использовать файл конфигурацииAutowiredAnnotationBeanPostProcessor beanОпределение может достичь той же цели.

<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
использовать@Autowiredаннотация

Теперь, с включенной конфигурацией аннотаций, не стесняйтесь использовать@Autowiredавтоматическое подключениеbeanзависимости. Это можно сделать тремя способами:

@AutowiredАтрибуты

использовать на свойствах@Autowiredэквивалентно передаче в файле конфигурацииbyTypeавтоматический впрыск

public class EmployeeBean
{
    @Autowired
    private DepartmentBean departmentBean;
 
    public DepartmentBean getDepartmentBean() {
        return departmentBean;
    }
    public void setDepartmentBean(DepartmentBean departmentBean) {
        this.departmentBean = departmentBean;
    }
    //More code
}
@Autowiredв свойствахsetterметод

в атрибутеsetterметод использования@Autowired, это также эквивалентно передачеbyTypeЗаймитесь автоматической сборкой.

public class EmployeeBean
{
    private DepartmentBean departmentBean;
 
    public DepartmentBean getDepartmentBean() {
        return departmentBean;
    }
 
    @Autowired
    public void setDepartmentBean(DepartmentBean departmentBean) {
        this.departmentBean = departmentBean;
    }
    //More code
}
@Autowiredна конструкторе

существуетbeanиспользовать в конструкторе@Autowired, это также эквивалентно передаче в конфигурационном файлеconstructorЗаймитесь автоматической сборкой.


package cn.howtodoinjava.autowire.constructor;
 
public class EmployeeBean
{
    @Autowired
    public EmployeeBean(DepartmentBean departmentBean)
    {
        this.departmentBean = departmentBean;
    }
 
    private DepartmentBean departmentBean;
 
    public DepartmentBean getDepartmentBean() {
        return departmentBean;
    }
    public void setDepartmentBean(DepartmentBean departmentBean) {
        this.departmentBean = departmentBean;
    }
    //More code
}

@QualifierРешение конфликта

Мы узнали, что если бы мыbyTypeВ режиме автосвязывания контейнер ищет зависимости в типе класса свойства. Если такой тип не найден, возникает ошибка. Однако, если есть два или более одного и того же типа классаbean,что делать?

при этих обстоятельствах,springне сможет выбрать правильныйbeanдля ввода свойств, поэтому вам нужно будет использовать@QualifierАннотации в помощь контейнерам.

для разбора конкретногоbean, нам нужно использовать@Qualifierаннотации и@Autowiredаннотировать иbeanИмя передается в параметр аннотации. Взгляните на пример ниже:

public class EmployeeBean{
    @Autowired
    @Qualifier("finance")
    private DepartmentBean departmentBean;
 
    public DepartmentBean getDepartmentBean() {
        return departmentBean;
    }
    public void setDepartmentBean(DepartmentBean departmentBean) {
        this.departmentBean = departmentBean;
    }
    //More code
}

который повторяетсяbeanКонфигурация выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <context:annotation-config />
 
    <bean id="employee" class="cn.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor">
        <property name="fullName" value="Lokesh Gupta"/>
    </bean>
 
    <!--First bean of type DepartmentBean-->
    <bean id="humanResource" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" >
        <property name="name" value="Human Resource" />
    </bean>
 
    <!--Second bean of type DepartmentBean-->
     <bean id="finance" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" >
        <property name="name" value="Finance" />
    </bean>
</beans>

использоватьrequired = falseДелайте безошибочную автопроводку

даже в автопроводкеBeanС особой осторожностью в зависимостях вы все равно можете обнаружить странные сбои поиска. Поэтому, чтобы исправить это, вам нужно будет сделать автосвязывание необязательным, чтобы в случае, если зависимость не найдена, приложение не выдавало никаких исключений, а автосвязывание должно было игнорироваться.

Это можно сделать двумя способами:

  • Если вы хотите сделать конкретныйbeanнеобязательная специфичность атрибутовbeanАвтопроводку можно сделать по адресу@Autowiredиспользуется в аннотацияхrequired =“ false”Атрибуты.
    @Autowired (required=false)
    @Qualifier ("finance")
    private DepartmentBean departmentBean;`
    
  • Если вы хотите сделать это на глобальном уровне (т.е. для всехbeanВсе свойства в) применяют необязательную автоматическую проводку; используйте следующие параметры конфигурации.
     <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">
         <property name="requiredParameterValue" value="false" />
     </bean>
     
    

Исключить bean-компоненты из автопроводки

По умолчанию автопроводка сканирует и сопоставляет все в пределах области видимости.beanопределение. Если вы хотите исключить некоторыеbeanопределения, так что они не могут быть введены через режим автоматического подключения, могут быть установлены с помощьюfalseизautowire-candidateсделать это.

  1. использоватьautowire-candidateв видеfalseПолностьюbeanИсключить вне автоматической сборки кандидата. Это будет конкретноbeanОпределения полностью исключены из инфраструктуры автопроводки.
    <?xml version="1.0" encoding="UTF-8"?>
    <beans>
        <context:annotation-config />
     
        <bean id="employee" class="cn.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor">
            <property name="fullName" value="Lokesh Gupta"/>
        </bean>
        <!--Will be available for autowiring-->
        <bean id="humanResource" class="cn.howtodoinjava.autowire.constructor.DepartmentBean" >
            <property name="name" value="Human Resource" />
        </bean>
     
        <!--Will not participate in autowiring-->
         <bean id="finance"      class="cn.howtodoinjava.autowire.constructor.DepartmentBean" autowire-candidate="false">
            <property name="name" value="Finance" />
        </bean>
    </beans>
    
    
  2. Другой метод основан наbeanСопоставление имен с образцом для ограничения числа кандидатов на автоматическое связывание. верхняя<beans/>элемент в егоdefault-autowire-candidateAttributes принимает один или несколько атрибутов. Например, чтобы ограничить кандидатов на автосвязывание именами, начинающимися сImplлюбое окончаниеbean, укажите значение* Impl. Чтобы указать несколько режимов, определите их в списке, разделенном запятыми.
     <?xml version="1.0" encoding="UTF-8"?>
     <beans default-autowire-candidates="*Impl,*Dao">
         <context:annotation-config />
      
         <bean id="employee" class="com.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor">
             <property name="fullName" value="Lokesh Gupta"/>
         </bean>
         <!--Will be available for autowiring-->
         <bean id="humanResource" class="com.howtodoinjava.autowire.constructor.DepartmentBean" >
             <property name="name" value="Human Resource" />
         </bean>
      
         <!--Will not participate in autowiring-->
          <bean id="finance"      class="com.howtodoinjava.autowire.constructor.DepartmentBean" autowire-candidate="false">
             <property name="name" value="Finance" />
         </bean>
     </beans>
    

Пожалуйста, обрати внимание,beanОпределенныйautowire-candidateстоимость имуществаtrueилиfalseВсегда предпочтительнее, и для этогоbean, правила сопоставления с образцом не применяются.

ЭтоSpring beanВсе об автопроводке.

Оригинальная ссылка:Автопроводка Spring Bean — @Autowired