spring 学习 (注解)
目录
前言
常用的注解
须知
1 @Conponent注解
demo(案例)
2 @Controller+@Service+@Repository
demo(案例)
3 @Scope+@Lazy+@PostConstruct+@PreDestroy
demo(案例)
4 @Value+@Autowired+@Qualifier+@Resource
demo(案例)
5 @Configuration+@ComponentScan+@PropertySource+@import
demo(实例)
前言
之前学习 spring 框架时,我们知道实例化bean 都是依靠 spring 配置文件,在配置文件中书写一个个bean 标签,表示将要创建的对象。
本篇博客则是 使用注解的方式,平替之前使用 spring 配置文件创建对象,等操作。
Spring的注解可以代替xml配置;通俗点来讲,注解是对xml配置的平替;原先xml配置所实现的功能,现在可以使用注解实现;而且使用注解比xml配置更符合我们编码习惯,也更简单。
常用的注解
须知
以下任何demo(案例的前提)
即使我们使用各自注解代替 标签,属性啥的。但如何去解析 注解这是我们需要思考的。
以下在配置文件中写的 标签就是解析哪个包下的注解。
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--spring会去扫描fs包及其子包下所有的注解,并让其生效-->
<context:component-scan base-package="fs">
</context:component-scan>
</beans>
注意:
1 base-package 的属性值 是 你需要扫描哪个包下的注解
2 不要直接复制粘贴,看需要哪个补充哪个,否则很容易出问题。
3 当然了,这些最后同样会有相应注解替代 配置文件,扫描注解的标签。但需要注意任何注解的底层都是 以xml 配置文件的形式存在。
1 @Conponent注解
使用目的
@Conponent注解 就可以平替<bean>标签。
特别提醒:在使用spring注解的时候,要想使spring容器认识这些注解,我们需要在bean.xml文件中配置注解组件扫描,只有配置了组件扫描,spring才会去指定包下面扫描你使用了哪些注解,并让其生效。
<!--spring会去扫描com.frank包及其子包下所有的注解,并让其生效--><context:component-scan base-package="com.frank"></context:component-scan>
demo(案例)
使用 Conponent 注解 创建 person 类
person 类,Test 测试类
package fs.exerise;import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;@Component("person")
public class Person {
}
class Test{public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Object bean = context.getBean("person");System.out.println(bean);}
}
效果展示

注意:component 注解里的值,可以理解为表示 之前在spring 配置文件 bean 标签的id 值。
2 @Controller+@Service+@Repository
我们在实际的开发过程中是按层来进行的;为了语义上面更加明确,所以衍生出来另外三个注解来代替@Conponent。他们的作用是为了在语义上更加明确。
@Controller注解:使用在Controller层的类上面
@Service注解:使用在Service层的类上面
@Repository注解:使用在Dao层的类上面
demo(案例)

3 @Scope+@Lazy+@PostConstruct+@PreDestroy
@Scope注解:平替<bean scope="">
@Lazy注解:平替<bean lazy-init="">
@PostConstruct注解:平替<bean init-method="">
@PreDestroy注解:平替<bean destroy-method="">
demo(案例)
UserController 类
package fs.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
// 相当于本类 UserController 在 配置文件的 bean 标签
@Controller("user")
// scope 属性表示作用域
@Scope(value = "singleton")
public class UserController {public UserController() {System.out.println("创建UserController");}// @PostConstruct 注解表示初始化方法
@PostConstructpublic void init () {System.out.println("UserController初始化");}// @PreDestroy 注解表示销毁方法
@PreDestroypublic void destroy () {System.out.println("UserController销毁");}
}
Test 测试类
package fs.controller;import org.springframework.context.support.ClassPathXmlApplicationContext;public class test {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");UserController userController = (UserController) app.getBean("user");
// 关闭 spring 容器 app.close();}}
效果展示

4 @Value+@Autowired+@Qualifier+@Resource
平替bean标签注入时的标签
原先使用xml实现注入的时候使用的是<property>标签来指明注入的关系;现在我们可以通过下面的注解来替换它。
@value注解:使用在字段或者方法上面,用于注入普通数据
@Autowired注解:使用在字段或者方法上面,用于注入引用数据(默认按照byType方式进行注入)
@Qualifier注解:使用在字段或者方法上面,搭配@Autowired根据名称进行注入
@Resource注解:使用在字段或者方法上面,根据类型或者名称进行注入
demo(案例)
userController 类
package fs.controller;import fs.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
// 相当于本类 UserController 在 配置文件的 bean 标签
@Controller("user")
// scope 属性表示作用域
@Scope(value = "singleton")
public class UserController {@Autowired// @Autowired 注解表示自动注入 一般适用于 成员变量
// @Qualifier 可以为 @Autowired 注解的补充,表示注入的bean的id@Qualifier("userService")private UserService userService;// @Value 注解表示注入值@Value("dj")private String name;public void a(){System.out.println(userService+"他的名字是"+name);}public UserController() {System.out.println("创建UserController");}// @PostConstruct 注解表示初始化方法
@PostConstructpublic void init () {System.out.println("UserController初始化");}// @PreDestroy 注解表示销毁方法
@PreDestroypublic void destroy () {System.out.println("UserController销毁");}
}
疑问:@Autowired注解是根据类型进行注入的,那如果我有多个UserDao类型呢?
答:所以这个时候@Qualifier注解的作用就起来了,它的作用是当发现你使用了@Autowired注解后,却有多个相同的类型,可以通过@Qualifier注解指定其中的一个名字进行注入(按名字注入)。
看案例:
我再新建一个UserDaoImp2类,让该类也去实现UserDao接口,重新观察 UserController 类
UserDaoImp1 类package fs.Dao.impl;import fs.Dao.UserDao; import org.springframework.stereotype.Repository;@Repository("UserDao1") public class UserDaoImp1 implements UserDao { }UserDaoImpl2 类package fs.Dao.impl;import fs.Dao.UserDao; import org.springframework.stereotype.Repository;@Repository("UserDao2") public class UserDaoImpl2 implements UserDao { }UserController 类
发现 ,因为存在 多个 userDao 的实现类,即使使用 Autowired 注解 也不知道 选择哪一个。
因此采取办法是 使用@Qualifier注解 选择其中一个 注入 进去
注意:@Resource注解:不给参数的时候相当于@Autowired进行注入;给了参数相当于@Autowired+@Qualifier
5 @Configuration+@ComponentScan+@PropertySource+@import
@Configuration 注解: 平替bean.xml文件
@ComponentScan 注解: 平替 <context:component-scan base-package="com.frank">
@PropertySource("jdbc.properties") 注解: 平替 <context:property-placeholder location="classpath:jdbc.properties">
@Import(MyDataSource.class)注解:平替 <import resource="classpath:">
注意:
bean.xml文件都被配置类给替换了,那么我在写测试类创建容器对象的时候就不能用
new ClassPathXmlApplicationContext(“bean.xml”)了;而是选择使用new AnnotationConfigApplicationContext(SpringConfig.class)。
demo(实例)
person 类
package fs.exerise;import org.springframework.stereotype.Component;@Component("person")
public class Person {
}
扫描所写注解的类
package fs.exerise;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
// @Configuration 注解表示当前类是一个配置类,用来代替xml配置文件
@Configuration
// @ComponentScan 注解表示扫描包,用来代替xml配置文件
// basePackages 属性表示扫描的包
@ComponentScan(basePackages ="fs.exerise")
public class SpringConfigration {
}
Test 测试类
package fs.exerise;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class test {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfigration.class);Object bean = context.getBean("person");System.out.println(bean);}
}
效果展示

相关文章:
spring 学习 (注解)
目录 前言 常用的注解 须知 1 Conponent注解 demo(案例) 2 ControllerServiceRepository demo(案例) 3 ScopeLazyPostConstructPreDestroy demo(案例) 4 ValueAutowiredQualifierResource demo(案例) 5 Co…...
计算机等级考试——计算机三级——网络技术部分
计算机三级——网络技术部分 一、外部网关协议BGP考点二、IPS入侵防护系统考点三、OSPF协议考点四、弹性分组环——RPR技术 一、外部网关协议BGP考点 高频考点,中考次数:25次 这类知识采用背诵的方式,可以更快速地备考。 BGP是边界网关协议&…...
新版电脑通过wepe安装系统
官方下载链接 WIN10下载 WIN11下载 微PE 启动盘制作 1:选择启动盘的设备 2:选择对应的U盘设备,点击安装就可以,建议大于8g 3:在上方链接下载需要安装的程序包,放入启动盘,按需 更新系统 …...
oracle中decode怎么转换成pg
对于 PostgreSQL 中的 Oracle DECODE 函数,可以使用 CASE 表达式或联合。CASE 表达式根据条件返回第一个匹配的结果,语法为:CASE WHEN 条件 THEN 结果 ELSE 结果 END。联合通过 UNION ALL 操作符组合多个 SELECT 语句,返回一个包含…...
【NLP】循环神经网络RNN
目录 一、词嵌入层 二、循环网络层 2.1 RNN网络原理 2.2 Pytorch RNN API 自然语言处理(Nature language Processing,NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言…...
Linux嵌入式完整镜像烧写到SD卡中的方法(包括对SD卡的介绍)
前言 本篇博文是博文https://blog.csdn.net/wenhao_ir/article/details/145547974 的分支,在本篇博文里我们主要是完成将镜像文件imx-image-full-imx6ull14x14evk-20201209093926.rootfs.wic烧写到SD卡中。 SD卡的介绍 SD卡(Secure Digital卡…...
vscode怎么更新github代码
vscode怎么更新github代码 打开终端: 在 VS Code 中,使用快捷键 Ctrl (Mac 上是 Cmd) 打开终端。 导航到项目目录: 确保你当前所在的终端目录是你的项目目录。如果不是,可以使用 cd 命令导航到项目目录,例如…...
回顾Golang的Channel与Select第二篇
深入掌握Go Channel与Select:从原理到生产级实践 一、Channel基础:不只是数据管道 1.1 通道的完整生命周期(可运行示例) package mainimport ("fmt""time" )func main() {// 创建缓冲通道ch : make(chan i…...
基于mediapipe深度学习的手势数字识别系统python源码
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 程序运行配置环境: 人工智能算法python程序运行环境安装步骤整理-CSDN博客 3.部分核心…...
JS实现大文件切片上传以及断点续传
切片上传的原理是: 1.因为file对象的基类是blob,所以可以使用slice分割 2.将从input中获取的file对象使用slice进行分割,每5M一片 3.分别上传各个切片,等待切片上传完通知服务端合并(或者传每一片时把切片总数量也传…...
AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI
前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…...
小众宝藏分子生物学实验中常用的软件:InSequence
欢迎使用InSequence,正版免费使用,操作友好,小白也能轻松上手哦~ 1. 全新中文界面与更大操作空间 全中文简洁直观的操作界面,常用功能固定至工具栏,随心自定义更改工具栏,让科研人员能够更快速地上手&…...
【自学笔记】机器学习基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 机器学习重点知识点总览一、机器学习基础概念二、机器学习理论基础三、机器学习算法1. 监督学习2. 无监督学习3. 强化学习 四、机器学习处理流程五、机器学习常见问…...
HCIA综合项目之多技术的综合应用实验
十五 HCIA综合实验 15.1 IP规划 #内网分配网段192.168.1.0 24#内网包括骨干链路和两个用户网段,素以需要划分三个,借两位就够用了192.168.1.0 26--骨干192.168.1.64 26---R1下网络192.168.1.128 26---R2下网络192.168.1.192 26--备用192.168.1.64 26--…...
[免费]Springboot+Vue医疗(医院)挂号管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue医疗(医院)挂号管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue医疗(医院)挂号管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 在如今社会上,关于信息上…...
网络基础 【UDP、TCP】
1.UDP 首先我们学习UDP和TCP协议 要从这三个问题入手 1.报头和有效载荷如何分离、有效载荷如何交付给上一层的协议?2.认识报头3.学习该协议周边的问题 UDP报头 UDP我们先从示意图来讲解,认识报头。 UDP协议首部有16位源端口号,16位目的端…...
Linux centos8部署maven3.9.9
Linux环境为centos8 一、环境配置 下载部署maven之前先需要先部署好Java环境,我这里是Java17.0.6 先去官网下载jdk包,然后进行环境配置 vim /etc/profile 配置如下: export JAVA_HOME/root/jdk-17.0.6 #Java的安装目录 export JRE_HOM…...
谈谈云计算、DeepSeek和哪吒
我不会硬蹭热点,去分析自己不擅长的跨专业内容,本文谈DeepSeek和哪吒,都是以这两个热点为引子,最终仍然在分析的云计算。 这只是个散文随笔,没有严谨的上下游关联关系,想到哪里就写到哪里。 “人心中的成见…...
链表(典型算法思想)—— OJ例题算法解析思路
目录 一、2. 两数相加 - 力扣(LeetCode) 算法代码: 1. 初始化 2. 遍历链表并相加 3. 返回结果 举例说明 二、24. 两两交换链表中的节点 - 力扣(LeetCode) 算法代码: 代码思路 举例说明 初始状…...
【C++指南】解锁C++ STL:从入门到进阶的技术之旅
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 一、STL 是什么 二、STL 的核心组件 2.1 容器(Containers) 2.2 算法&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...


