Spring 自动装配机制详解

一、手动装配

首先知道 Spring 装配是干了件啥事?我的理解,它就是用来解决 bean 之间依赖关系的一个手段。

比如说我这里有一个 People 类和一个 Dog 类,People 依赖 Dog,也就是说一个人拥有一只狗,人和狗之间是存在依赖关系的,我们都知道 IOC容器就负责管理对象的创建及依赖关系的维护,那么狗和人之间的依赖关系自然就交给 Spring 容器来管理了,而这个依赖关系是需要装配的。

本篇主要讲解的是自动装配,但是在说自动装配之前,我们先来看一下手动装配是怎么装配的,通过对比,你就知道自动装配有多 yyds 了!

① 实体类准备,一个 People 类和一个 Dog 类

在这里插入图片描述

在这里插入图片描述

② 编写核心配置文件,并手动装配 bean 依赖关系

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dog" class="com.zxe.pojo.Dog"/>

    <bean id="people" class="com.zxe.pojo.People">
        <property name="name" value="栈老师"/>
        <property name="dog" ref="dog"/>
    </bean>

</beans>

可以看到,手动装配的 dog 依赖,是用 ref 引用的!

二、自动装配

1. XML 方式

这种方式主要就是用到了 autowire 属性,属性值有 byName 和 byType 两种。接下来以 byName 为例,实体类还是上面的 People 和 Dog。

① 以 byName 方式装配

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dog" class="com.zxe.pojo.Dog"/>

    <bean id="people" class="com.zxe.pojo.People" autowire="byName">
        <property name="name" value="栈老师"/>
    </bean>

</beans>

在这里插入图片描述

这里需要进一步说明一下 byName 和 byType 的区别:
① byName,顾名思义是通过名字去装配的,在 People 中注入一个 Dog,需要将 setDog 方法名里面的 dog 拿出来到核心配置里面找,找什么呢?找 id 名为 dog 的 bean,找到了之后自动注入,注意从实体类里面拿到的这个 dog 一定是 set 后面的内容,并不是变量名
② byType,它是通过类型装配的,将 People 里的 Dog 类型拿出来,到配置文件里找 class 为 Dog 的 bean,然后自动注入, bean 的类型肯定就不能一样了,否则无法找到

2. 注解方式

还有一种最常用的装配方式就是注解装配,它是通过反射来实现的。

① 开启注解支持,<context:annotation-config/>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
    <bean id="dog" class="com.zxe.pojo.Dog"/>

    <bean id="people" class="com.zxe.pojo.People">
        <property name="name" value="栈老师"/>
    </bean>

</beans>

② 使用 @Autowired 注解标注依赖属性

在这里插入图片描述

注解方法装配属性的过程, @Autowired 默认会优先根据属性的类型去容器中找对应的组件,找到就赋值,如果找到了多个相同类型的组件,我们可以组合使用@Autowired与@Qualifier,@Qualifier 是根据名称来查找的。

猜你喜欢

转载自blog.csdn.net/m0_52861684/article/details/132448985