- 在 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 赋值会给引用类型。
- 同源关系:
- 引用类型的数据类型和 bean 的 class 值是同源关系的,也就是包名前缀目录是一样的。
- 引用类型的数据类型和 bean 的 class 值是父子类关系的,也就是继承(extend)关系
- 引用类型的数据类型和 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 中只能符合一种,重复关系会抛出异常