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 算法&…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...