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

基于注解的自动装配~

@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&#xff1a;实现自动装配功能的注解 Autowired注解能够标识的位置&#xff1a; 标识在成员变量上&#xff0c;此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上使用注解进行自动装配&#xff0c;只要在其成员变量…...

【深度学习】【分布式训练】Collective通信操作及Pytorch示例

相关博客 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B&#xff1a;一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…...

Spring常用注解说明

目录 1.常用注解 2.特别说明 3.xml及注解方式 1.常用注解 (1) SpringBootApplication (2) ControllerRestControllerRequestMappingRequestParamPathVariableGetMappingPostMappingPutMappingDeleteMappingResponseBodyRequestBodyCrossOrigin (3) ConfigurationBeanServ…...

13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)

虚析构函数 存在父类指针指向子类对象的情况&#xff0c;应该将析构函数声明为虚函数&#xff08;虚析构函数&#xff09; 纯虚函数 纯虚函数&#xff1a;没有函数体且初始化为0的虚函数&#xff0c;用来定义接口规范 抽象类&#xff1a; 含有纯虚函数的类&#xff0c;不可以实…...

Android DataBinding 自定义View实现数据双向绑定

看不懂的可以先看看单向数据绑定&#xff1a;Android DataBinding数据变化时自动更新界面_皮皮高的博客-CSDN博客 然后再确定已经启动了dataBinding的情况下&#xff0c;按下面的顺序来&#xff1a; 首先创建一个自定义View&#xff1a; import android.content.Context imp…...

网络安全中的渗透测试主要那几个方面

渗透测试中主要有软件测试和渗透测试。 1、测试对象不同 软件测试&#xff1a;主要测试的是程序、数据、文档。 渗透测试&#xff1a;对象主要为网络设备、主机操作系统、数据库系统和应用系统。 2、测试内容不同 软件测试&#xff1a;主要工作内容是验证和确认&#xff0c;发…...

Cursor:GPT-4 驱动的强大代码编辑器

Cursor &#xff08;https://www.cursor.so/&#xff09;是 GPT-4 驱动的一款强大代码编辑器&#xff0c;可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜&#xff0c;如下…...

C/C++中for语句循环用法及练习

目录 语法 下面是 for 循环的控制流&#xff1a; 实例 基于范围的for循环(C11) 随堂笔记&#xff01; C语言训练-计算1~N之间所有奇数之和 题目描述 输入格式 输出格式 样例输入 样例输出 环形方阵 干货直达 for 循环允许您编写一个执行特定次数的循环的重复控制结构。…...

AnimatorOverrideController说明

unity-AnimatorOverrideControllerhttps://docs.unity.cn/cn/current/ScriptReference/AnimatorOverrideController.html 用于控制动画器重写控制器的接口。 动画器重写控制器的用途是重写某个控制器的动画剪辑&#xff0c;从而为给定化身定制动画。 在运行时基于相同的 Anim…...

1.4、第三阶段 MySQL数据库

root数据库技术 一、数据库理论 1 什么是数据库技术 数据库技术主要研究如何组织、存储数据&#xff0c;并如何高效地提取和处理数据。 2 什么是SQL SQL&#xff08;Structured Query Language&#xff09;结构化查询语言 SQL是操作数据库的命令集&#xff0c;也是功能齐全的…...

LeetCode:202. 快乐数

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;202. 快乐数 题目描述&#xff1a;编写一个算法来判断一个数 n 是不是快…...

Android 14 新功能之 HighLights:快速实现文本高亮~

日常开发中可能会遇到给 TextView 的全部或部分文本增加高亮效果的需求&#xff0c;以前可能是通过 Spannable 或者 Html 标签实现。 升级 Android 14 后就不用这么迂回了&#xff0c;因其首次引入直接设置高亮的 API&#xff1a;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服务器仅接收到部分请求&#xff0c;但是一旦服务器并没有拒绝该请求&#xff0c;客户端应该继续发送其余的请求。101 Switching Protocols服务器转换协议&#xff1a;服…...

蓝桥杯刷题冲刺 | 倒计时15天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.年号字串2.裁纸刀3.猜生日1.年号字串 题目 链接&#xff1a; 年号字串 - 蓝桥云课 (lanqiao.c…...

【差分数组】

差分数组一维差分差分数组的作用差分矩阵结语一维差分 输入一个长度为 n 的整数序列。接下来输入 m个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加上 c &#xff0c;请你输出进行完所有操作后的序列。 输入格式 第一行包含两个…...

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类&#xff08;管理者&#xff09; 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】…...

搭建一个双系统个人服务器

搭建一个双系统个人服务器0.前言一、双系统安装1.磁盘划分2.windows安装3.ubuntu安装二、系统启动项美化&#xff1a;1. refind引导2. 美化 grub 界面三、系统代理0.前言 年后找了份工作&#xff0c;忙于适应新环境所以更新也减缓了&#xff0c;最近闲暇时间给个人电脑进行了整…...

电脑长按电源键强行关机,对SSD有伤害吗?SSD 掉盘之殇

说到“按住电源键强制关机”的操作&#xff0c;想必大家都不会陌生&#xff0c;毕竟在电脑蓝屏或者电脑死机的时候&#xff0c;我们总是束手无策。而且&#xff0c;身边的人在遇到同样的情况时&#xff0c;往往都是选择长按电源键强制关机&#xff0c;所以当我们遇到同样的情况…...

Linux:centos内核优化详解

一、系统内核部分设置在以下文件 vim /etc/sysctl.conf 1.禁用IPV6 net.ipv6.conf.all.disable_ipv6 1 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.default.disable_ipv6 1 net.ipv6.conf.lo.disable_ipv6 1 # 禁用某一个指定接口的IPv6(此处为:lo) 理想情况下&#xff0c…...

链表经典OJ题合集(包含带环问题,相交问题,随机指针复制等,附动画讲解)

目录 一&#xff1a;前言 二&#xff1a;简单题目 (1)移除链表元素 (2)反转链表 (3)找链表的中间结点 (4)输入一个链表&#xff0c;输出该链表中倒数第k个结点 (5)合并两个有序链表 (6)相交链表 (7)判断链表是否带环 三&#xff1a;较难题目 (1)链表分割 (2)判断链表是否为回…...

CSS新增

系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录什么是 CSS3渐进增强和优雅降级CSS3 中的选择器CSS3 中的背景CSS3 中的边框CSS3 中的文本效果CSS3 中的字体 font-face什么是 CSS3 CSS3是CSS&#xff08;层叠样式表&#xff09;技术的升级版…...

奇安信_防火墙部署_透明桥模式

奇安信_防火墙部署_透明桥模式一、预备知识二、项目场景三、拓扑图四、基本部署配置1. 登录web控制台2.连通性配置3.可信主机配置4.授权导入5.特征库升级6.安全配置文件五、透明桥配置1. 创建桥2. 端口绑定桥3. 创建桥端口六、结语一、预备知识 安全设备接入网络部署方式 二、…...

C语言——字符串函数(2)和内存函数

(一)strtok函数dilimiters参数是个字符串&#xff0c;定义了用作分隔符的字符集合第一个参数指定一个字符串&#xff0c;它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记&#xff0c;并将其用 \0 结尾&#xff0c;返回…...

第1节 线性回归模型

1. 模型概述 对于收集到的数据(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;建立线性回归模型yiθTxiεi(1)y_i\theta^{^T} x_i \varepsilon_i (1)yi​θTxi​εi​(1) 需要估计的参数为θT\theta^{^T}θT&#xff0c;我们的目的是让估计的参数θT\theta^{^T}θT和xix_ixi​…...

CodeGeeX 130亿参数大模型的调优笔记:比FasterTransformer更快的解决方案

0x0 背景 相信大家都使用或者听说过github copilot这个高效的代码生成工具。CodeGeeX类似于github copilot&#xff0c;是由清华大学&#xff0c;北京智源研究院&#xff0c;智谱AI等机构共同开发的一个拥有130亿参数的多编程语言代码生成预训练模型。它在vscode上也提供了插件…...

Linux驱动之并发与竞争

文章目录并发与竞争的概念原子操作原子整形操作 API 函数原子位操作 API 函数自旋锁自旋锁简介自旋锁结构体自旋锁 API 函数自旋锁的注意事项读写自旋锁读写自旋锁的API顺序锁顺序锁的APIRCU(Read-Copy-Update)RCU的API信号量信号量API互斥体互斥体的API完成量(Completion)完成…...

可以做外国网站文章/电销系统软件排名

计算某个范围之内的所有质数/* --功能&#xff1a;计算某个范围之内的所有质数 --作者&#xff1a; --日期&#xff1a;20180927 --语言&#xff1a;t-sql for sql server 2012 sp4 */ DECLARE n INT 10000; --计算自然数的最大值 DECLARE d INT 2;--除数&#xff0c;检验n能够…...

山西今日头条新闻消息/网站关键词优化排名怎么做

作为原始的调试方式&#xff0c;开发者可以使用帮助函数中的DBGPRINTF()在应用中的任何位置将调试信息打印到模拟器的输出窗口中。模拟器的输出窗口还会显示大量的AEE层运行时产生的信息&#xff0c;这些信息的含义如表16-1所示。 标识 含义 #*gBI BREW 进行初始化 #*gEX 退出B…...

建设网站内容的策划书/百度链接收录

在棋盘&#xff08;N*N&#xff09;上放置N个皇后&#xff0c;使他们互不攻击&#xff0c;此时每个皇后的 攻击范围为 同行同列同对角线要求找出所有解 恰好每行每列放置一个皇后 如果用C[x]表示第x行皇后的列号&#xff0c;就成为了一个全排列问题 static int ans;static i…...

delphi WordPress/深圳高端seo公司助力企业

启动页的作用 在我遇到这个实际问题之前&#xff0c;我一直认为启动页的作用是美化产品&#xff0c;提升软件逼格。但实际上&#xff0c;它更重要的是起到了一个拦截器的作用。比如&#xff0c;当App首页需要动态得从网上加载数据时&#xff0c;就必须请求网络权限&#xff0c…...

廊坊建站服务/新媒体营销案例分析

最近遇到一个有意思的bug&#xff0c;是关于VSCode编辑器插件的&#xff0c;赶项目时间非常紧&#xff0c;说实话在这时平常用的顺手的IDE出问题非常影响心情。「这就像是你开在高速路上&#xff0c;吃着火锅唱着歌&#xff0c;突然轮胎爆了&#xff0c;你说气不气人」。不过在…...

免费sem工具/高级seo优化招聘

默认情况下用dw是以普通的text文件打开html.erb文件&#xff0c;这多少让人有点不爽。其实dw打开erb文件也是相当的容易&#xff0c;下面就简单说下在mac os X下如何让dw支持erb文件&#xff1a; 首先找到dw的用户Configuration文件夹位置,注意不是Application中的应用程序里的…...