Spring 自动装配机制详解

news2025/1/13 17:43:21

文章目录

    • 一、手动装配
    • 二、自动装配
      • 1. XML 方式
      • 2. 注解方式

一、手动装配

首先知道 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 注解标注依赖属性

在这里插入图片描述

注解方法装配属性的过程,spring 默认会优先根据属性的类型去容器中找对应的组件,找到就赋值,如果找到了多个相同类型的组件,就根据属性的名称再去容器里找对应 id 的组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp - 实现卡片式胶囊单选后右上角出现 “√“ 对勾对号选中效果功能,适用于小程序h5网页app全平台通用(一键复制组件源码,开箱即用!)

效果图 uniapp全平台兼容(小程序/h5网页/app)实现点击选择后,右上角出现 √ 对号效果(角标形式展现),功能组件, 改个样式,直接复制使用该组件。 组件源码 在 components 组件文件夹下,随便建立一个 .vue 文件,一键复制下方源码。

ModaHub魔搭社区:AI Agent在网络购物场景下的AgentBench基准测试

目录 AgentBench评估哪些场景? 近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现…

发力服务业务,龙湖集团半程领跑赢在“智慧”

成立三十载&#xff0c;龙湖集团一直是房地产行业“特立独行”的存在。 一方面&#xff0c;龙湖在对外战略方面长期量入为出&#xff0c;从不背上过重的“包袱”。 不久前&#xff0c;一则消息引发市场关注&#xff1a;龙湖集团提前偿还17亿元债务&#xff0c;已基本全部还清…

solidity0.8.0的应用案例12:通用可升级合约UUPS

代理合约中选择器冲突(Selector Clash)的另一个解决办法:通用可升级代理(UUPS,universal upgradeable proxy standard)。代码由OpenZeppelin的UUPSUpgradeable简化而成,不应用于生产。 UUPS 作为透明代理的替代方案,UUPS也能解决"选择器冲突"(Selector Cl…

ARM开发(cortex-A7核中断实验)

1.实验目的&#xff1a;实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反&#xff1b; key1 ----> LED3灯状态取反&#xff1b; key2 ----> LED2灯状态取反&#xff1b; key3 ----> LED1灯状态取反&#xff1b; 2.分析框图: …

特征值分解、SVD分解在线性最小二乘解上的应用

1. 奇异值分解(SVD)原理 1.1 回顾特征值和特征向量 我们首先回顾下特征值和特征向量的定义如下&#xff1a; A x λ x Axλx Axλx其中A是一个nn的实对称矩阵&#xff0c;x是一个n维向量&#xff0c;则我们说λ是矩阵A的一个特征值&#xff0c;而x是矩阵A的特征值λ所对应的…

数据之美:探索数据可视化设计的奇妙世界

在信息时代的浪潮中&#xff0c;海量的数据正在影响着我们的生活和决策。然而&#xff0c;数据本身虽然有力量&#xff0c;但如何将其有机地呈现给我们&#xff0c;却成为了一个挑战。数据可视化设计应运而生&#xff0c;它不仅让枯燥的数字变得生动&#xff0c;还带来了一场视…

修复磁盘错误需要一小时才能完成怎么办?

“修复磁盘错误需要一小时才能完成”是一种常见的问题&#xff0c;当你遇到这个问题&#xff0c;又不想长时间等待时&#xff0c;可以尝试一下方式进行解决。 方法1. 在安全模式中解决 1. 在启动电脑看到Windows标志时&#xff0c;长按电源键强行关机&#xff0c;重复此操作三…

2023年8月第3周大模型荟萃

2023年8月第3周大模型荟萃 2023.8.22版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、LLM-Adapters&#xff1a;可将多种适配器集成到大语言模型 来自新加坡科技设计大学和新加坡管理大学的研究人员发布了一篇题为《LLM-Adapters: An …

Linux系统之安装OneNav个人书签管理器

Linux系统之安装OneNav个人书签管理器 一、OneNav介绍1.OneNav简介2.OneNav特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查本地yum仓库状态 四、安装httpd服务4.1 安装httpd4.2 启动httpd服务4…

什么是客服外包?为什么越来越多的店家选择客服外包?

客服外包&#xff0c;即是将自己的客户服务体系交给更专业的团队。 1.省钱&#xff08;无需人员成本、无需设备成本、无需支付薪资&#xff09; 2.省时&#xff08;无需招聘员工、无需员工管理、无需员工培训&#xff09; 3.高效&#xff08;人工AI智能、流水线操作、专业培…

如何拉取Gitee / GitHub上的Unity项目并成功运行

前言 由于目前大部分人使用的仓库都是Gitee或者是GitHub&#xff0c;包括小编的公司所使用的项目仓库也包括了Gitee&#xff1b;我们需要学习技术栈时都会去百度或者是去GitHub上看看别人的项目观摩学习&#xff0c;可能很多小白在遇到拉取代码时出现各种问题&#xff0c;或者…

Windows wsl2支持systemd

背景 很多Linux发行版都是使用systemd来管理程序进程&#xff0c;但是在WSL中默认是用init来管理进程的。 为了符合长久的使用习惯&#xff0c;且省去不必要的学习成本&#xff0c;就在WSL的发行版&#xff08;我这里安装的是Ubuntu20.04&#xff09;中支持systemd&#xff0…

每日汇评:英镑的韧性掩盖了更广泛的疲态,英镑相关货币分析

1、尽管英国CPI数据强劲&#xff0c;但英镑/美元未能延续涨势&#xff1b; 2、欧元/英镑向下突破的时机可能已经成熟&#xff0c;英镑/日元的反弹目前正在失去动力&#xff1b; 3、英镑交叉盘的关键水平至关重要&#xff1b; 上周英国公布强劲通胀数据后&#xff0c;英镑未能…

Microsoft Message Queuing Remote Code Execution Vulnerability

近期官方公布了一个MSMQ的远程代码执行漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 Microsoft Message Queuing 概述 MicroSoft Message Queuing&#xff08;微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输…

根据学生学习水平量身定制指导以促进知识蒸馏的效果

文章目录 Tailoring Instructions to Student’s Learning Levels Boosts Knowledge Distillation一、PPT内容P1 BackgroundP2 L2T--online distillationP3 L2T--Meta distillationP4 Approach--LGTMP5 Distillation influenceP6 Finite difference approximationP7 Teachers a…

VMware 17 Player下CentOS的安装与配置

本文详细记录VMware 17 Player的安装&#xff0c;以及其中Centos虚拟机的安装&#xff1b;内容包含下载、安装全过程&#xff1b;另外包含一些基本的应用测试阐述。 安装VMware VMware下载 点击即可下载&#xff1a;https://www.vmware.com/go/getplayer-win 官网里面找版本&…

对于pycharm 运行的时候不在cmd中运行,而是在python控制台运行的情况,如何处理?

对于pycharm 运行的时候不在cmd中运行&#xff0c;而是在python控制台运行的情况&#xff0c;如何处理&#xff1f; 比如&#xff0c;你在运行你的代码的时候 它总在python控制台运行&#xff0c;十分难受 解决方法 在pycharm中设置下即可&#xff0c;很简单 选择运行点击…

介绍Server-Sent Events,以及使用,超级简单!

一、SSE 的本质 严格地说&#xff0c;HTTP 协议无法做到服务器主动推送信息。但是&#xff0c;有一种变通方法&#xff0c;就是服务器向客户端声明&#xff0c;接下来要发送的是流信息&#xff08;streaming&#xff09;。 也就是说&#xff0c;发送的不是一次性的数据包&…

文心一言 VS 讯飞星火 VS chatgpt (80)-- 算法导论7.4 5题

五、如果用go语言&#xff0c;当输入数据已经“几乎有序”时&#xff0c;插入排序速度很快。在实际应用中&#xff0c;我们可以利用这一特点来提高快速排序的速度。当对一个长度小于 k 的子数组调用快速排序时&#xff0c;让它不做任何排序就返回。当上层的快速排序调用返回后&…