IoC 自动装载(Autowire)
后期在开发过程中经常会用到。
什么是 IoC 自动转载?
自动装载 是完成 bean 之间的依赖注入,即 DI 方式。
为什么要用自动装载?
IoC 负责创建对象;
DI 负责完成对象的依赖注入,通过配置 property 标签的 ref 属性来完成,同时 Spring 提供了另外一种更加简便的依赖注入方式:自动装载 ,不需要手动配置 property,IoC 容器会自动选择 bean 完成 DI 注入。
过去为完成 DI 注入,需要在 property 标签中配置 ref
属性值
<!-- 通过有参构造来创建bean的映射对象 -->
<bean id="student2" class="com.thesunandsnow.entity.Student">
<constructor-arg name="id" value="3"></constructor-arg>
<constructor-arg name="name" value="Jay"></constructor-arg>
<constructor-arg name="age" value="40"></constructor-arg>
<constructor-arg name="address" ref="address"></constructor-arg>
</bean>
<bean id="address" class="com.thesunandsnow.entity.Address">
<property name="id" value="1"></property>
<property name="name" value="解放路"></property>\
</bean>
自动装载有两种方式:
- byName :通过属性名自动装载
- byType :通过属性的数据类型自动装载
byName 的自动装载步骤
byName 顾名思义,就是通过 bean 标签的 id 属性来完成 DI 注入。
byName 自动装载方式会根据对象的实例域的名字,自动的在 xml 中寻找与名称相同的 bean id 属性。若找到,则完成自动装载。
-
查看实体类:
这个实体类需要注入 Car 对象
package com.thesunandsnow.entity; import lombok.Data; @Data public class Person { private long id; private String name; private Car car; }
-
先在 xml 中配置一个 Car 对象的 bean 标签
bean 标签的 id 属性不是随便取的,必须为 car,因为即将注入这个对象的 Person 对象的 实例域 中 Car 类的名称就是 car,byName 方式要求 bean 的 id 必须与 实例域名称相同。
<bean id="car" class="com.thesunandsnow.entity.Car" p:id="1" p:name="宝马"></bean>
-
在想注入 car 的 bean 标签中添加
autowire
属性,属性值即自动装载方式:byNane
即可完成自动装载。
<bean id="person" class="com.thesunandsnow.entity.Person" autowire="byName"> <property name="id" value="11"></property> <property name="name" value="张三"></property> </bean>byType 即根据数据
byType 的自动装载步骤
byType 即根据数据类型去寻找。
与 byName 方式不同,byType 只在 xml 中寻找与 实例域 数据类型一样的 bean 标签来完成自动装载步骤。
<bean id="cars" class="com.thesunandsnow.entity.Car" p:id="1" p:name="宝马"></bean>
<bean id="person" class="com.thesunandsnow.entity.Person" autowire="byType">
<property name="id" value="11"></property>
<property name="name" value="张三"></property>
</bean>
注意:这种方式当然不允许一个 xml 文件中有两个及以上的相同的类型。