持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
前言
回想一下我们前面是怎么完成Spring的依赖注入的?是通过IoC创建对象,以及property和constructor-arg的ref属性来实现的依赖注入。其实Spring还有一种更加简洁的依赖注入方式,这种方式就是自动装载。
自动装载
- 不需要自己手动配置,IoC会自动的选择bean完成注入。
- 实现Spring的自动装载有两种方式:
1.byName:使用属性名进行自动装载。
2.byType:使用属性的数据类型进行自动装载。
手动装载
我们先来回顾一下之前手动装载的依赖注入方式
<bean id="host" class="com.xyj.Host">
<property name="name" value="xyj"></property>
<property name="age" value="21"></property>
</bean>
<bean id="dog" class="com.xyj.Dog">
<property name="name" value="bob"></property>
<property name="age" value="5"></property>
<property name="variety" value="秋田"></property>
<property name="host" ref="host"></property>
</bean>
使用property标签的ref属性实现手动装载的依赖注入方式。
自动装载
byName
1.创建Dog类
package com.xyj;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
private String name;
private int age;
private String variety;
private Host host;
}
2.创建Host类
package com.xyj;
import lombok.Data;
@Data
public class Host {
private String name;
private int age;
}
3.配置bean
<bean id="host" class="com.xyj.Host">
<property name="name" value="xyj"></property>
<property name="age" value="21"></property>
</bean>
<bean id="dog" class="com.xyj.Dog" autowire="byName">
<property name="name" value="bob"></property>
<property name="age" value="5"></property>
<property name="variety" value="秋田"></property>
</bean>
请大家仔细观察对比下这里使用byName的方式进行自动装载与我们上面的手动装载方式有什么不同。
首先,在被注入的bean标签中加入了autowire="byName";其次,相比于手动装载,自动装载少了<property name="host" ref="host"></property>。
从这里就可以看出,自动装载相比于之前的手动装载方式简便许多。
那通过byName进行自动装载的这种方式是如何实现的呢?
当使用byName时,IoC会进入Dog类中自动搜索Dog类中的成员变量,如果Dog类中有与配置文件中的bean相同名称的成员变量,IoC就会将配置文件中对应的bean自动装载到Dog类中。反之,如果Dog类中没有与配置文件中的bean相同名称的成员变量,就不会完成自动装载。
byType
与byName非常类似,只不过这里是通过类型进行自动装载的。
<bean id="host" class="com.xyj.Host">
<property name="name" value="xyj"></property>
<property name="age" value="21"></property>
</bean>
<bean id="dog" class="com.xyj.Dog" autowire="byType">
<property name="name" value="bob"></property>
<property name="age" value="5"></property>
<property name="variety" value="秋田"></property>
</bean>
可以看到用byType进行自动装载相比于使用byName,只需要将autowire的属性值改为byType即可。
使用byType进行自动装载就是对比成员变量与配置文件中bean的数据类型,如果有相同的,则会自动装载;反之,则不会进行自动装载。
自动装载使Spring的bean之间的依赖注入更加的方便。