Spring 自动装载

382 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

前言

回想一下我们前面是怎么完成Spring的依赖注入的?是通过IoC创建对象,以及propertyconstructor-argref属性来实现的依赖注入。其实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之间的依赖注入更加的方便。