Когда мы встретимся? Смущен в это время и ночь.
Обзор
существуетSpringframework, объявленный в конфигурационном файлеbeanзависимости является хорошей практикой, потому чтоSpringКонтейнеры способны к совместной автоматической сборкеbeanОтношения между. это называетсяspringАвтопроводка.
自动装配功能具有四种模式。 Бытьno,byName,byTypeиconstructor.
Автоматическое определение другого режима автоматического подключения устарело.
DocsСказатьautodetectслишком много вариантовmagic, желательно с более явным утверждением.
-
XMLРежим автопроводки по умолчанию в конфигурацииno. -
JavaРежим автопроводки по умолчанию в конфигурацииbyType.
Режим автопроводки
-
noВариантspringПараметр по умолчанию для фреймворка, означающий, что автоматическое подключение отключено.OFF. мы должны бытьbeanиспользуется в определении<property>Теги явно устанавливают зависимости. -
byNameЭта опция включает на основеbeanВнедрение зависимостей по имени. существуетBeanПри автоматическом связывании свойств в , имя свойства используется для поиска в файле конфигурации соответствующегоBeanопределение. Если вы найдете такиеbean, введите его в свойство. Если вы не можете найти такойbean, вылетает ошибка. -
byTypeЭтот вариант поддерживает на основеbeanтип внедрения зависимости. существуетbeanПри автоматическом подключении свойства в , тип класса свойства используется для поиска в файле конфигурации соответствияbeanопределение. Если вы найдете такойbeanВнедрите его в свойство. Если вы не найдете этоbean, Выдает ошибку. -
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сделать это.
- использовать
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> - Другой метод основан на
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