自动装配模式

Exisi 2022-06-28 07:42:34
Categories: Tags:
  • Spring <bean> autowire 属性为引用类型为引用外部实体类对象作为成员变量

 

public class Student(){

 

private String name;

private String age;

private School school ;

 

}

 

  • Spring 可以根据某些规则给引用类型完成赋值。 只对 引用类型 有效。

autowire 属性值

描述

default

默认,采用父级标签 <bean> 中的default-autowire属性

byName

通过属性名称来自动装配,即A类中的B对象名称为name,那么将根据id="name"找到该bean进行装配,A类必须提供setName方法;

byType

根据属性类型来找到和配置文件中配置的class类型一致的bean来自动装配,如果找到多个类型一致的bean,则抛异常,如果一个都没有找到,则不执行装配操作,也不抛出异常。

no

不执行自动装配操作,只能用<ref>标签进行装配;对于大型部署,建议不要更改默认设置,因为明确指定协作者可以提供更好的控制和清晰度。在某种程度上,它记录了系统的结构。

constructor

类似于 byType,但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个 bean,则将引发致命错误。

  • 使用byType或构造函数自动连接模式,可以连接数组和类型化集合。在这种情况下,提供容器中与预期类型匹配的所有自动连线候选项,以满足依赖关系。如果所需的键类型为String,则可以自动连接强类型映射实例。自动连线的Map实例的值由与期望类型匹配的所有bean实例组成,Map实例的键包含相应的bean名称。

 

 

 

byName(按名称注入)

  • Java 类中引用类型属性名称和 Spring 容器中 bean id 名称 一样的,且数据类型也是一样的,这些 bean 能够赋值给引用类型。

示例

<!-- byName 自动注入 -->

<bean id="myStudent" class="com.bjpowernode.Student" autowire="byName">

  <property name="name" value="李四" />

  <property name="age" value="22" />

  <!--引用类型的赋值-->

  <property name="school" ref="School" />

</bean>

 

<!--声明School-->

<bean id="school" class="com.bjpowernode.ba04.School">

  <property name="name" value="清华大学" />

  <property name="address" value="北京的海淀区" />

</bean>

 

 

 

byType(按类型注入)

  • Java 类中引用类型的数据类型和 Spring 容器中 bean class 值是同源关系的,这样的 bean 赋值会给引用类型。

 

  • 同源关系:
    1. 引用类型的数据类型和 bean class 值是同源关系的,也就是包名前缀目录是一样的。
    2. 引用类型的数据类型和 bean class 值是父子类关系的,也就是继承(extend)关系
    3. 引用类型的数据类型和 bean class 值是接口(interface & extend)和实现类(implement)关系的

示例

<!-- byType 自动注入 -->

<bean id="myStudent" class="com.bjpowernode.Student" autowire="byType">

  <property name="name" value="张三" />

  <property name="age" value="26" />

  <!--引用类型的赋值-->

  <property name="school" ref="School" />

</bean>

 

<!--声明School-->

<bean id="mySchool" class="com.bjpowernode.School">

  <property name="name" value="清华大学" />

  <property name="address" value="北京的海淀区" />

</bean>

  • 以上三种同源关系在 byType 中只能符合一种,重复关系会抛出异常