基于注解的自动装配~
@Autowired:实现自动装配功能的注解
@Autowired注解能够标识的位置:
标识在成员变量上,此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上
使用注解进行自动装配,只要在其成员变量上添加@Autowired即可,在之前基于XML的自动装配时,我们使用的是autowire属性,我们需要为其成员变量设置set和get方法,但使用注解的方式进行自动装配是不需要要这一过程的
控制层:调用service处理业务逻辑
package springIocAnnotation_packages.spring_controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import springIocAnnotation_packages.spring_Service.UserService;@Controller("controller")
public class UserController {@Autowired //使用@Autowired表示为自动装配private UserService userService;public void saveUser(){userService.saveUser();}
}
业务层:
package springIocAnnotation_packages.spring_Service;import org.springframework.stereotype.Service;@Service
public interface UserService {void saveUser();
}
业务层的实现类:业务层中调用Dao实现持久化操作
package springIocAnnotation_packages.spring_Service.impl;import org.springframework.stereotype.Service;
import springIocAnnotation_packages.spring_Dao.UserDao;
import springIocAnnotation_packages.spring_Service.UserService;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic void saveUser() {userDao.saveUser();}
}
持久层:
package springIocAnnotation_packages.spring_Dao;public interface UserDao {void saveUser();
}
持久层实现类:
package springIocAnnotation_packages.spring_Dao.impl;import org.springframework.stereotype.Repository;
import springIocAnnotation_packages.spring_Dao.UserDao;@Repository
public class UserDaoImpl implements UserDao {@Overridepublic void saveUser() {System.out.println("保存成功~");}
}
spring-ioc-annotation.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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="springIocAnnotation_packages"></context:component-scan>
</beans>
测试类如下:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springIocAnnotation_packages.spring_controller.UserController;public class spring_ByAnnotationTest {@Testpublic void test(){ApplicationContext ioc=new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userController= ioc.getBean( UserController.class);userController.saveUser();}
}
测试结果如下所示:

@Autowired:实现自动装配的原理
在之前的学习中,我们了解到,自动装配是将autowire属性的值设置为byName[将要赋值的属性的名字作为bean的id,再在IOC容器中去匹配到某一个bean为当前属性进行赋值]或者byType[根据类型在IOC容器中获取类型匹配的bean为当前的属性自动进行赋值]
那么现在我们使用注解的方式到底是根据byName还是byType呢?
答案:byType
那么为什么不能是byName呢?
我们这里要赋值的成员变量叫userservice,和它类型匹配的是UserServiceImpl,很明显当前的属性名和其id是不相同的,因为我们在上篇文章中就说过,使用注解
+扫描的方式管理的bean的id默认是其类的小驼峰形式,而UserServiceImpl的小驼峰形式为userServiceImpl,对于持久层也是如此,userDao和它类型匹配的是UserDaoImpl,它的小驼峰形式为userDaoImpl,由此可说明@Autowired默认通过byType的方式,在IOC容器中通过类型匹配到某个bean来为
尚属性进行赋值
既然是根据类型,那么就会发生匹配到多个类或者是一个都没匹配到,如下所示:
在XML文件中,添加两个bean对象,使其id和我们的成员变量一致
<bean id="userService" class="springIocAnnotation_packages.spring_Service.impl.UserServiceImpl"></bean>
<bean id="userDao" class="springIocAnnotation_packages.spring_Dao.impl.UserDaoImpl"></bean>
经过上述修改以及结合我们之前学过知识,我们知道这种情况下,会抛出无法匹配到唯一bean的异常,那么事实真的如此吗?
一测便知:
测试结果如下所示:

竟然输出了保存成功,难道是我们之前学习的知识有问题?
那当然不是,原因是 :默认情况下,它是通过byType实现自动装配,但是如果有多个类型匹配的bean,它将通过byName
既然byType不行,那就byName,但是有没有一种情况是二者都不满足呢?
也就是:如果byType和byName的方式都无法实现自动装配,即IOC容器中有多个类型匹配的bean,且这些bean的id和要赋值的的属性的属性名不一致,那么会抛出异常:NoUniqueBeanDefinitionException
测试如下:
手动修改id的值,使其与成员变量名不相同,下述这种情况就满足byType和byName都无法实现自动装配
<context:component-scan base-package="springIocAnnotation_packages"></context:component-scan>
<bean id="Service" class="springIocAnnotation_packages.spring_Service.impl.UserServiceImpl"></bean>
<bean id="Dao" class="springIocAnnotation_packages.spring_Dao.impl.UserDaoImpl"></bean>
测试结果如下:

针对上述这种情况,我们的解决办法为在其成员变量上添加@Qualifier注解,通过该注解的value值去指定某个bean的id,将这个bean为该属性赋值
如下所示:


测试结果如下所示:

那么如果byType一个都没匹配到呢?
若IOC容器中没有任何一个类型匹配的bean,此时抛出异常NoSuchBeanDefinitionException,在@Autowired注解中有个属性required,默认值为true,要求必须完成自动装配,可以将required设置为false,设置为false之后的效果即为能装配则装配,不能装配则使用属性的默认值
测试如下:
1:我们将XML文件中的bean对象删除
2:将所有的@Qualifier删除
3:删除UserServiceImpl类上@Service注解
三步完成之后,进行测试:
报错如下:
//没有任何一个UserService的类可用,至少需要一个bean来完成自动装配的效果,所依赖的Autowired注解中的required属性//导致异常产生的原因就是当前Autowired注解中的required属性的值为true,默认情况下必须完成自动装配,不完成自动装配直接报错
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'springIocAnnotation_packages.spring_Service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
上述所说的也是一种特殊情况,既然是Autowired注解中的required属性的值为true导致的异常产生,那么我们将其设置为 false是否可以解决这个问题呢?
测试结果如下:

上面我们说默认的byType不行,那么我们就使用byName,要是还不行,再使用新的注解@Qualifier,但这种特殊的情况在实际的开发中是非常少的,因为一个类型的bean,我们只会在IOC容器中配置一次,我们不可能配置多次,这个时候我们使用默认的byType即可
相关文章:
基于注解的自动装配~
Autowired:实现自动装配功能的注解 Autowired注解能够标识的位置: 标识在成员变量上,此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上使用注解进行自动装配,只要在其成员变量…...
【深度学习】【分布式训练】Collective通信操作及Pytorch示例
相关博客 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…...
Spring常用注解说明
目录 1.常用注解 2.特别说明 3.xml及注解方式 1.常用注解 (1) SpringBootApplication (2) ControllerRestControllerRequestMappingRequestParamPathVariableGetMappingPostMappingPutMappingDeleteMappingResponseBodyRequestBodyCrossOrigin (3) ConfigurationBeanServ…...
13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)
虚析构函数 存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数) 纯虚函数 纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范 抽象类: 含有纯虚函数的类,不可以实…...
Android DataBinding 自定义View实现数据双向绑定
看不懂的可以先看看单向数据绑定:Android DataBinding数据变化时自动更新界面_皮皮高的博客-CSDN博客 然后再确定已经启动了dataBinding的情况下,按下面的顺序来: 首先创建一个自定义View: import android.content.Context imp…...
网络安全中的渗透测试主要那几个方面
渗透测试中主要有软件测试和渗透测试。 1、测试对象不同 软件测试:主要测试的是程序、数据、文档。 渗透测试:对象主要为网络设备、主机操作系统、数据库系统和应用系统。 2、测试内容不同 软件测试:主要工作内容是验证和确认,发…...
Cursor:GPT-4 驱动的强大代码编辑器
Cursor (https://www.cursor.so/)是 GPT-4 驱动的一款强大代码编辑器,可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜,如下…...
C/C++中for语句循环用法及练习
目录 语法 下面是 for 循环的控制流: 实例 基于范围的for循环(C11) 随堂笔记! C语言训练-计算1~N之间所有奇数之和 题目描述 输入格式 输出格式 样例输入 样例输出 环形方阵 干货直达 for 循环允许您编写一个执行特定次数的循环的重复控制结构。…...
AnimatorOverrideController说明
unity-AnimatorOverrideControllerhttps://docs.unity.cn/cn/current/ScriptReference/AnimatorOverrideController.html 用于控制动画器重写控制器的接口。 动画器重写控制器的用途是重写某个控制器的动画剪辑,从而为给定化身定制动画。 在运行时基于相同的 Anim…...
1.4、第三阶段 MySQL数据库
root数据库技术 一、数据库理论 1 什么是数据库技术 数据库技术主要研究如何组织、存储数据,并如何高效地提取和处理数据。 2 什么是SQL SQL(Structured Query Language)结构化查询语言 SQL是操作数据库的命令集,也是功能齐全的…...
LeetCode:202. 快乐数
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱202. 快乐数 题目描述:编写一个算法来判断一个数 n 是不是快…...
Android 14 新功能之 HighLights:快速实现文本高亮~
日常开发中可能会遇到给 TextView 的全部或部分文本增加高亮效果的需求,以前可能是通过 Spannable 或者 Html 标签实现。 升级 Android 14 后就不用这么迂回了,因其首次引入直接设置高亮的 API:HighLights。需要留意的是 HighLights API 和 …...
[渗透教程]-004-嗅探工具-Nmap
文章目录 Nmap介绍基本操作进阶操作Nmap介绍 nmap是一个网络扫描和主机检测工具,它可以帮助用户识别网络上的设备和服务。获取主机正在运行哪些服务,nmap支持多种扫描,UDP,TCP connect(),TCP SYN(半开扫描) ftp代理,反向标志,ICMP,FIN,ACK扫描,ftp代理,反向标志,ICMP. 可以用于…...
大数据技术之Hive SQL题库-初级
第一章环境准备1.1 建表语句hive>-- 创建学生表 DROP TABLE IF EXISTS student; create table if not exists student_info(stu_id string COMMENT 学生id,stu_name string COMMENT 学生姓名,birthday string COMMENT 出生日期,sex string COMMENT 性别 ) row format delim…...
常见HTTP状态码汇总
文章目录1xx: 信息2xx: 成功3xx: 重定向4xx: 客户端错误5xx: 服务器错误1xx: 信息 状态码描述100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。101 Switching Protocols服务器转换协议:服…...
蓝桥杯刷题冲刺 | 倒计时15天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.年号字串2.裁纸刀3.猜生日1.年号字串 题目 链接: 年号字串 - 蓝桥云课 (lanqiao.c…...
【差分数组】
差分数组一维差分差分数组的作用差分矩阵结语一维差分 输入一个长度为 n 的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c ,请你输出进行完所有操作后的序列。 输入格式 第一行包含两个…...
2022年NOC软件创意编程(学而思)决赛小学高年级组scratch
2022NOC决赛图形化小高组 一、选择题 1.运行下面的程序,最终“我的变量”的值是多少? 2.希望定义一个函数如下,可以让角色旋转指定的圈数。里面空缺的地方填上什么数字比较合适? 3.运行程序,在舞台上可以看见几个角色 ? 4.运行程序,角色会依次说什么 ? 5.我们都知…...
[JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]
目录 1.想法 2.框架的搭构 2.1图书 2.1.1Book类 2.1.2BookList类 2.2用户 2.2.1User抽象类 2.2.2AdminUser类(管理者) 2.2.3NormalUser 2.3操作 操作接口 借阅操作 删除操作 查询操作 归还图书 展示图书 退出系统 2.4小结 3.主函数的编…...
大数据周会-本周学习内容总结07
目录 01【hadoop】 1.1【编写集群分发脚本xsync】 1.2【集群部署规划】 1.3【Hadoop集群启停脚本】 02【HDFS】 2.1【HDFS的API操作】 03【MapReduce】 3.1【P077- WordCount案例】 3.2【P097-自定义分区案例】 历史总结 01【hadoop】 1.1【编写集群分发脚本xsync】…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
