当前位置: 首页 > news >正文

Spring——自动装配

假设一个场景:
一个人(Person)有一条狗(Dog)和一只猫(Cat),狗和猫都会叫,狗叫是“汪汪”,猫叫是“喵喵”,同时人还有一个自己的名字。
将上述场景 抽象出三个实体类:Person、Dog和Cat

Persion.java

package com.zbt.autowire.dto;/*** @author* @createAt 2025/1/9 20:44*/public class Person {private Dog dog;private Cat cat;private String name;public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}public Cat getCat() {return cat;}public void setCat(Cat cat) {this.cat = cat;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"dog=" + dog +", cat=" + cat +", name='" + name + '\'' +'}';}
}

Dog.java

package com.zbt.autowire.dto;/*** @author* @createAt 2025/1/9 20:42*/public class Dog {public void shout(){System.err.println("小狗叫:wang~");}
}

Cat.java

package com.zbt.autowire.dto;/*** @author* @createAt 2025/1/9 20:43*/public class Cat {public void shout(){System.err.println("小猫叫:miao~");}
}

手动装配

在配置文件中注入属性—这种方式为xml手动注入(显示注入)

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog" class="com.zbt.autowire.dto.Dog"/><bean id="cat" class="com.zbt.autowire.dto.Cat"/><bean id="person" class="com.zbt.autowire.dto.Person"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>
</beans>

通过配置文件 自动装配

bean标签有一个属性叫做 autowire 它配置的是自动装配方式

byName注入

通过配置的其他的bean的id自动匹配参数名,相同则注入(换种说法:将和属性名相同的Bean id 对应的对象当做值进行注入)

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog" class="com.zbt.autowire.dto.Dog"/><bean id="cat" class="com.zbt.autowire.dto.Cat"/><!--<bean id="person" class="com.zbt.autowire.dto.Person"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>--><bean id="person" class="com.zbt.autowire.dto.Person" autowire="byName"><property name="name" value="张三"/></bean>
</beans>

上面的例子中,Person中有cat和dog 在配置文件中Cat和Dog类的Bean id也是cat和dog,此时可以通过在Person的Bean上设置**autowire=“byName”**自动将cat和dog注入到Person中
注意 如果需要被注入的bean的id与属性名不同则无法注入
例如下面这种情况就无法给Person注入dog

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog1" class="com.zbt.autowire.dto.Dog"/><bean id="cat" class="com.zbt.autowire.dto.Cat"/><!--<bean id="person" class="com.zbt.autowire.dto.Person"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>--><bean id="person" class="com.zbt.autowire.dto.Person" autowire="byName"><property name="name" value="张三"/></bean>
</beans>

接下来我们在另一个包entity下在新建一个Cat类,同样也有一个shout方法

package com.zbt.autowire.entity;/*** @author* @createAt 2025/1/9 21:09*/public class Cat {
public void shout(){System.err.println("entity里的Cat");
}
}

在配置文件中对两个Cat类的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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog1" class="com.zbt.autowire.dto.Dog"/><bean id="cat1" class="com.zbt.autowire.dto.Cat"/><bean id="cat" class="com.zbt.autowire.entity.Cat"/><!--<bean id="person" class="com.zbt.autowire.dto.Person"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>--><bean id="person" class="com.zbt.autowire.dto.Person" autowire="byName"><property name="name" value="张三"/></bean>
</beans>

此时Person注入的cat对象为entity包下的Cat

编写如下测试代码可验证结果:

import com.zbt.autowire.dto.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author* @createAt 2025/1/9 21:01*/public class MyTest {@Testpublic void testAutowire(){ApplicationContext context = new ClassPathXmlApplicationContext("beansAutowire.xml");Person person = context.getBean("person", Person.class);person.getCat().shout();}
}

控制台输出为
在这里插入图片描述
注意我划线部分的报错,意思是无法将entity下的Cat转换为dto下的Cat(因为Person类中的Cat类型为dto下的Cat,而注入的根据bean的id匹配到的是entity下的,所以报了这个错误)

byType注入

通过配置的其他的bean的calss设置的类自动匹配参数类型,相同则注入(换种说法:查找与属性类型相同的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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog1" class="com.zbt.autowire.dto.Dog"/><bean id="cat" class="com.zbt.autowire.dto.Cat"/><!--<bean id="person" class="com.zbt.autowire.dto.Person"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>--><bean id="person" class="com.zbt.autowire.dto.Person" autowire="byType"><property name="name" value="张三"/></bean>
</beans>

上面的例子中,Person中有cat和dog 在配置文件中也配置了Cat和Dog类的Bean,此时可以通过在Person的Bean上设置**autowire=“byType”**自动将cat和dog注入到Person中,与Cat和Dog的Bean的id无关。

同时在配置文件中也配置entity.cat的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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dog1" class="com.zbt.autowire.dto.Dog"/><bean id="cat" class="com.zbt.autowire.dto.Cat"/><bean id="cat1" class="com.zbt.autowire.entity.Cat"/><!--<bean id="person" class="com.zbt.autowire.dto.Person"><property name="name" value="张三"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>--><bean id="person" class="com.zbt.autowire.dto.Person" autowire="byType"><property name="name" value="张三"/></bean>
</beans>

发现最终注入的还是dto下的Cat(可以通过上述的测试代码可以发现控制台输出的是:“小猫叫:miao~”而不是:“entity里的Cat”,可以验证结论)

弊端: 必须保证每个类只能在配置文件里配置一次,一个类多次被配置时无法使用byType自动装配

通过注解 自动装配(@Autowire 、@Resource)

需要在配置文件中导入约束(context — 共三个)并添加一项配置( context:annotation-config/) 才能支持注解的使用
context 约束:

  1. xmlns:context=“http://www.springframework.org/schema/context”
    2.xsi:schemaLocation下的:" http://www.springframework.org/schema/context"
    3.xsi:schemaLocation下的:" https://www.springframework.org/schema/context/spring-context.xsd"
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>

@Autowire

原理:

  1. Autowire注解优先通过byType方式匹配bean,byType匹配不到再通过byName匹配
  2. 为了防止Autowire匹配不到bean,经常将Autowire与Qualifire搭配使用 通过 @Qualifire(value=“配置文件中的bean id”) 指定要匹配的bean 的id(Autowire + Qualifire 等价于 Resource)

用法
写在属性名上一行或者set方法上一行即可自动装配
推荐写在属性名上一行,因为属性名上使用此注解后,可以省略set方法(前提是配置文件中配置了对应的bean)
autowire的require属性:默认为true 代表这个属性的值不能为null,如果@Autowire(require = false) 则代表这个属性可以为null

@Resource

@Resource是jdk自带的注解
它可以指定name(bean的id),如@Resource(name=“cat”)
在不指定name的情况下:先byName,后byType。与Autowire的正好相反
用法
写在属性名上一行或者set方法上一行即可自动装配
推荐写在属性名上一行,因为属性名上使用此注解后,可以省略set方法(前提是配置文件中配置了对应的bean)

相关文章:

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…...

Servlet与JSP:Java的秘密花园入口

1 Servlet概述 Servlet是Java Web应用中的一个核心组件&#xff0c;它是一个运行在服务器端的Java程序&#xff0c;可以响应客户端的请求并生成响应。Servlet为Web应用提供了一个统一的接口来处理HTTP请求。 2 Servlet的生命周期 Servlet的生命周期包括以下几个阶段&#xff…...

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…...

ELFK日志采集实战

一、日志分析概述 日志分析是运维工程师解决系统故障&#xff0c;发现问题的主要手段 日志主要包括系统日志、应用程序日志和安全日志 系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因 经常分析日志可以了解服务器的负荷&#x…...

Kubernetes 使用自定义资源(CRD)扩展API

K8s CRD 即 Kubernetes CustomResourceDefinition&#xff0c;是 Kubernetes 提供的一种扩展机制&#xff0c;允许用户在 Kubernetes 集群中定义和使用自定义的资源类型。通过定义 CRD&#xff0c;用户可以在 Kubernetes 集群中创建、读取、更新和删除自定义资源对象&#xff0…...

用户使用LLM模型都在干什么?

Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析&#xff0c;主要发现及相关情况如下&#xff1a; 使用用途分布 软件开发主导&#xff1a;在各类使用场景中&#xff0c;软件开发占比最高&#xff0c;其中编码占 Claude 对话的 15% - 25%&#xff0c;网页和移动应…...

MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)

MySQL常用命令汇总 简介 ‌MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;现属于Oracle公司。‌ MySQL支持SQL&#xff08;结构化查询语言&#xff09;&#xff0c;这是数据库操作的标准语言&#xff0c;用户可以使用SQL进…...

六年之约day10

今日开心∶今天部门开了个颁奖大会&#xff0c;看着别人收获的荣誉&#xff0c;还真有些羡慕&#xff0c;什么时候&#xff0c;我也能拥有属于自己的荣誉啊. 今日不开心∶活没干多少&#xff0c;对业务也不是很懂 今日思考∶很多事情&#xff0c;存在即合理.工作&#xff0c;…...

springboot和vue配置https请求

项目场景&#xff1a; 代码发布到线上使用https请求需要配置ssl证书&#xff0c;前后端都需要修改。 问题描述 如图&#xff0c;我们在调用接口时报如下错误&#xff0c;这就是未配置ssl但是用https请求产生的问题。 解决方案&#xff1a; 前端&#xff1a;在vite.config.js文…...

selenium遇见伪元素该如何处理?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 问题发生 在很多前端页面中&#xff0c;大家会见到很多&#xff1a;:before、::after 元素&#xff0c;比如【百度流量研究院】&#xff1a; 比如【百度疫情大数…...

慧集通(DataLinkX)iPaaS集成平台-数据质量

1.什么是数据质量 介绍&#xff1a; 数据质量的主要作用就是记录组件写入的数据&#xff0c;及执行时的相关信息&#xff0c;如执行的最终状态&#xff08;成功&#xff0c;失败&#xff0c;进行中等&#xff09;&#xff0c;执行的时间&#xff08;创建时间&#xff0c;修改时…...

微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理

在当今这个云计算技术迅猛发展的时代&#xff0c;企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化&#xff0c;它们成为了企业运营不可或缺的支柱。网站可靠性工程师&#xff08;Site Reliability Engineers&#xff0c;简称SRE&#xff09;和DevOps团队肩负着关键…...

ElasticSearch | Elasticsearch与Kibana页面查询语句实践

关注&#xff1a;CodingTechWork 引言 在当今大数据应用中&#xff0c;Elasticsearch&#xff08;简称 ES&#xff09;以其高效的全文检索、分布式处理能力和灵活的查询语法&#xff0c;广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES&#xff0c;用户…...

12.C语言中的struct详解:定义、赋值、指针、嵌套与位字段

目录 1.简介2.struct 的复制3.struct 指针4.struct 的嵌套5.位字段6.弹性数组成员 1.简介 本篇原文为&#xff1a;C语言中的struct详解&#xff1a;定义、赋值、指针、嵌套与位字段。 更多C进阶、rust、python、逆向等等教程&#xff0c;可点击此链接查看&#xff1a;酷程网 …...

文件读写到SQLite数据库的方法

在 SQLite 数据库中&#xff0c;将文件读写到数据库的常见方法主要有以下几种&#xff1a; 1. 将文件以 BLOB 类型存储 BLOB&#xff08;Binary Large Object&#xff09; 是 SQLite 中的二进制数据类型&#xff0c;可以直接用来存储文件内容。 步骤&#xff1a; 创建表 创建一…...

springboot项目部署至linux

1.修改pom.xml 确认是否有以下代码&#xff0c;没有请进行添加&#xff0c;mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…...

使用sed命令封装自定义dos2unix脚本

使用sed命令封装自定义dos2unix脚本 创建 `dos2unix` 脚本使用自定义的 `dos2unix` 脚本注意事项要将 sed -i 封装为一个简单的 dos2unix 脚本,你可以创建一个 Bash 脚本文件,该文件接受文件名作为参数,并使用 sed 命令来删除文件中的 DOS 回车符(\r)。以下是一个基本的实…...

调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序

当pytest框架中有时时候会因为用例的前后关联关系需要调整用例执行顺序时则可以跟进具体的要求调整pytest.ini配置文件中执行用例文件夹的前后顺序 当如果是需要调整某个文件夹中用例的执行顺序时&#xff0c;则跟进具体的文件调整对应testcases中test_*.py文件中的执行顺序...

带内管理和带外管理

带内管理&#xff08;In-Band Management&#xff09; 概述 带内管理是一种借助生产网络来传输管理数据的网络管理方式&#xff0c;其管理流量与业务流量共享相同的网络路径。 特点 共享网络路径&#xff1a;管理数据和业务数据一同使用现有的网络基础设施&#xff0c;在同…...

【操作系统】阻塞非阻塞I/O、同步异步I/O

阻塞I/O&#xff1a;程序发起I/O操作时&#xff0c;程序被挂起&#xff0c;直到I/O操作完成并返回结果。在这个过程中&#xff0c;程序会被阻塞无法执行其他任务。适用于简单、低并发的场景。 非阻塞I/O&#xff1a;程序发起I/O操作时&#xff0c;不会等待&#xff0c;立即返回…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...