Spring基于注解开发
目录
一. Bean基本注解开发
二. Bean依赖注入注解开发
三. 非自定义Bean注解开发
四. Spring配置类的开发
五. Spring配置其他注解
5.1 @Primary
5.2 @Profile
六. Spring注入的解析原理
七. Spring注解方式整合第三方框架
一. Bean基本注解开发
Spring除了xml配置文件进行配置之外,还可以使用注解方式进行配置,注解方式慢慢成为xml配置的替代方案。
基本Bean注解,我们主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置
使用@Component注解替代<bean>标签。
原先我们配置是这样做的

而现在使用注解是这样的

之前的xml配置id是作为其beanName,然后根据全限定名寻找,现在我们的注解就在这个类上所以不需要全限定名,还要beanName我们可以给注解参数进行赋值。

这个时候我们使用之前的加载配置文件getBean就拿不到对应的对象了。

我们需要告诉他我们是用注解的方式进行注入的,需要在配置文件中进行注解组件扫描。

在之前spring基于xml开发中,我们做的自定义注解demo,那里的注解组件扫描是我们写死的,现在我们可以在配置文件中进行配置。

其实我们也可以基于之前的知识现在明白,这个配置不仅仅是扫描注解组件,还使用了Spring的后处理器进行"加工",其实后面spring很多的扩展点都是基于后处理器进行的。
在之前进行xml配置bean的时候,我们说过如果一个bean我们没有指定beanName,也就是没有在配置中写id,那么默认的beanName就是全限定名,而这里如果我们在@Component中没有写value参数,那么会是什么情况呢?


运行测试我们可以发现找不到这个bean了,那么我们看看内部情况。

我们可以发现如果没有写value,那么默认的beanName就是类名首字母小写。

我们使用@Component代替了<bean>标签,那么bean标签中属性如何进行配置呢?



我们知道JavaEE是分层的,为了语义化各层,所以@Component还有一些衍生注解:@Repository、@Service、@Controller。
@Repository在Dao层类上使用、@Servive在Service层类上使用、@Controller在web层类上使用
还有一些不属于任何层的我们就使用@Component。


二. Bean依赖注入注解开发
Bean的依赖注入注解,主要是使用注解的方式代替xml的<property>标签完成属性的注入操作
Spring提供了以下注解用于在Bean内部进行属性注入
- @Value:使用在字段或方法上,用于注入普通数据
- @Autowired:使用在字段或方法上,用于根据数据类型注入引用数据
- @Qualifier:使用在字段或方法上,配合@Autowired,根据名称注入
- Resource:使用在字段或方法上,根据类型或名称进行注入

使用Value注解进行username这个属性的注入,注入的值为zhangsan,并且打印一下username验证是否注入。

接下来我们看看使用@Autowired注入对象,这个也是后期最常用的注解。


形如之前的属性注入,我们也是可以使用set进行注入的。

接下来我们再看看配合@Autowired使用的@Qualifier是如何使用的。

此时我有两个UserDao对象,而@Autowired是根据类型进行注入的,如何判断注入的是哪个呢?
这个时候就可以使用@Qualifier,根据名称进行注入了。

最后我们看@Resource,不指定名称参数时,根据类型注入,指定名称就根据名称注入

@Autowired的扩展:

我们也可以这样使用将其注入。
三. 非自定义Bean注解开发
非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化使用@Bean标注方法即可,@Bean的属性为beanName,如不指定为当前工厂方法名称。


这里要注意的点是配置了@Bean的方法的类是要被Spring管理的。
还有就是要是我们想在方法中注入属性该如何操作呢?

在这里我们可以使用@Value进行普通属性注入,还可以使用@Qualifier进行指定名称的对象注入,但是@Qualifier不是需要配合@Autowired一起使用吗?
在属性注入的时候可以直接使用@Qualifier对指定名称的对象进行注入,并且如果使用@Autowired进行根据类型的注入,@Autowired可以省略。
四. Spring配置类的开发
上面的注解我们学习的都是替代xml文件中<bean>标签的,那么其他的配置我们是否也能用注解进行配置呢?也就是完全不需要配置文件。
接下来我们学习的就是配置类的注解开发。
我们使用这些注解来替代原先xml中的配置
这里的@Configuration也是@Component的衍生。
@ComponentScan是组件扫描配置
@PropertySource用于加载外部properties文件


并且这个时候在测试类中我们不再是以xml的方式加载spring容器,而是以配置类的形式。

五. Spring配置其他注解
5.1 @Primary
@Primary注解用于标注相同类型的Bean优先被使用权,@Primary是Spring3.0引入的,与@Component和@Bean一起使用,标注该Bean的优先级更高,则在通过类型获取Bean或通过@Autowired根据类型进行注入时,会选择优先级更高的。


5.2 @Profile
@Profile注解的作用同于xml配置时学习的<beans profile="test">是切换环境使用的。
@Profile可以标注在类或方法上,标注当前产生的Bean从属于哪个环境,只有激活当前环境,被标注的Bean才能被注入到Spring容器中,不指定环境的Bean,任何环境都可以注入到Spring容器。

可以使用以下两种方式指定被激活的环境:
- 使用命令行动态参数,虚拟机参数位置加载 -Dspring.profiles.active=test
- 使用代码方式指定环境变量,System.setProperty("spring.profiles.active","test");
六. Spring注入的解析原理

学习前先复习一下这张图。
这里由于注解的方式细节过多,这里介绍xml方式是如何注入的。

xml的方式进行注入是通过自定义命名空间进行的,我们先找到其对应的映射文件。

进入这个ContextNamespaceHandler

进入其对应的解析器ComponentScanBeanDefinitionParser,这里我们看关键方法


再来进入这个doScan,这里我们也看关键代码,将需要注入的对象都注册到BeanDefinitionMap中。
Spring注解的解析原理也是如此,最后的两步也是需要走doScan和register方法进行注册到BeanDefinitionMap中。
七. Spring注解方式整合第三方框架
第三方框架整合,依然使用MyBatis作为整合对象,之前已经使用xml方式整合了MyBatis,现在使用注解的方式无非就是将xml标签替换为注解,将xml配置文件替换为配置类即可。
之前xml方式整合MyBatis:

接下来我们就将其替换为注解的方式。

并且写一个方法进行测试


到这里Spring基于注解开发就差不多解释完了,这里我分享的比较来自于学习的课程b站的黑马spring课程,感兴趣可以看看。
相关文章:
Spring基于注解开发
目录 一. Bean基本注解开发 二. Bean依赖注入注解开发 三. 非自定义Bean注解开发 四. Spring配置类的开发 五. Spring配置其他注解 5.1 Primary 5.2 Profile 六. Spring注入的解析原理 七. Spring注解方式整合第三方框架 一. Bean基本注解开发 Spring除了xml配置文件…...
深度探索:智能家居背后的科技力量与伦理思考
目录 科技力量:创新驱动下的智慧生活引擎 1. 人工智能与机器学习 2. 物联网技术 3. 大数据分析 4. 5G与边缘计算 伦理与隐私:智能家居的双刃剑 1. 隐私侵犯风险 2. 数据安全挑战 3. 算法偏见与决策透明度 应对策略:构建安全、负责任的智能…...
鸿蒙开发:通过startAbilityByType拉起垂类应用
通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等,调用startAbilityByType接口拉起对应的垂域面板,该面板将展示目标方接入的垂域应用,由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…...
docker 更换镜像源
打开对应的配置文件 vi /etc/docker/daemon.json 输入文件内容入下 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8…...
Springboot(若依)国际化配置接口访问后返回????????
最近使用若依的框架进行二次开发,配置了国际化,application.yml配置英文时没问题,但配置中文basename: i18n/messages_zh_CN,访问接口就直接返回的???,如图: 于是检查了I18nConfig文件,没配错…...
java1
在继承中,创建子类对象,访问成员方法的规则: 创建的对象是谁,就优先用谁,没有再向上找 注意:无论是成员变量还是成员方法, 如果没有都是向上找父类,不会向下找子类 继承的特点&#…...
pytest中一个场景测试的demo
注意点1: allure.severity 是一个装饰器,用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一,表示这个测试用例极为重要。allure.severity_level.BLOCKER:阻塞级别的问题,…...
windows下安装IntelliJIDEA
windows下安装IntelliJIDEA 步骤1:下载IntelliJ IDEA 打开浏览器并访问IntelliJ IDEA下载页面. https://www.jetbrains.com/idea/download/选择合适的版本: Ultimate:付费版本,包含更多功能,适合专业开发。Community…...
string经典题目(C++)
文章目录 前言一、最长回文子串1.题目解析2.算法原理3.代码编写 二、字符串相乘1.题目解析2.算法原理3.代码编写 总结 前言 一、最长回文子串 1.题目解析 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s “babad” 输出&am…...
三篇卫星切换的论文
目录 一、Energy-Aware Satellite Handover based on Deep Reinforcement Learning 1、题目翻译 2、来源 3、内容 二、A Reliable Handover Strategy with Second Satellite Selection in LEO Satellite Networks 1、题目翻译 2、来源 3、内容 三、User Grouping-Based…...
VUE之重定向redirect
VUE之路由和重定向redirect 这个小知识点是在学习做项目的时候遇到的一个问题,借鉴了一个他人的项目,是一个酒店管理系统,拿到源码之后导到我的vscode里。 参考链接 导的过程比较顺利,正常安装,加依赖,没有…...
服务器时区与数据库时区不一致导致时间bug记录
1、背景 一个活动,需要按照自然月刷新,每月一期,以活动开始当月作为第一期,每期可配置不同数据。问题出现在:活动开始时间为本月,但是查询用户数据发现当前为第二期,反复查看代码,确…...
华为鸿蒙HarmonyOS应用开发者高级认证题库
判断题 1、云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用 错 2、在column和Row容器组件中,aligntems用于设置子组件在主轴方向上的对齐格式,justifycontent用于设置子组件在交叉轴方向上的对齐格式 错…...
细说MCU串口函数及使用printf函数实现串口发送数据的方法
目录 1、硬件及工程 2、串口相关的库函数 (1)串口中断服务函数: (2)串口接收回调函数: (3)串口接收中断配置函数: (4)非中断发送ÿ…...
PBox iOS端的应用隐藏、图片视频加密软件
哈喽,大家下午好!相信大家的手机中一定存在很多的私密内容,比如软件、照片、视频或者文档文件,很多都是不方便让外人看到的,此时就需要一款隐藏工具,市面上这类软件大部分都是收费的,应大家的需…...
【QT5】<总览五> QT多线程、TCP/UDP
文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】<总览四> QT常见绘图、图表及动画。若存在…...
fastadmin/thinkPHPQueue消息队列详细教程
thinkphp-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性: 消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等队列的多队列, 内存限制 ,启动,停止,守护等消息队列可降级为同步执行1、通过composer安装thinkPHP消息队列 …...
社区新标准发布!龙蜥社区标准化 SIG MeetUp 圆满结束
5 月 31 日,「龙蜥社区“走进系列”」第 9 期之走进阿里云于北京圆满结束。来自阿里云、浪潮信息、红旗软件、中兴通讯|中兴新支点、中科曙光、中科方德、统信软件、麒麟软件、万里红、普华基础软件、飞腾信息、凝思、申威、新华三等公司的 30 余位专家出席会议。会…...
快速开始一个go程序(极简-快速入门)
一、 实验介绍 1.1 实验简介 为了能更高效地使用语言进行编码,Go 语言有自己的哲学和编程习惯。Go 语言的设计者们从编程效率出发设计了这门语言,但又不会丢掉访问底层程序结构的能力。设计者们通过一组最少的关键字、内置的方法和语法,最终…...
HTTPS缺失?如何轻松解决IP地址访问时的“不安全”警告
一、问题现象 如果访问网站时出现以下任何一种情况,则说明该网站需要立即整改: 1.浏览器地址栏那里出现“不安全”字样; 2.小锁标志被红叉()、斜线(\)等标志为不可用;…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
