Когда мы встретимся? Смущен в это время и ночь.
Обзор
существуетSpring
framework, объявленный в конфигурационном файле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-candidate
Attributes принимает один или несколько атрибутов. Например, чтобы ограничить кандидатов на автосвязывание именами, начинающимися с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