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.小锁标志被红叉()、斜线(\)等标志为不可用;…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
