【Spring篇】Spring注解式开发
本文根据哔哩哔哩课程内容结合自己自学所得,用于自己复习,如有错误欢迎指正;
我在想用一句话激励我自己努力学习,却想不出来什么惊为天人、精妙绝伦的句子,脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”,是啊!不过唯手熟尔!
目录
Spring注解式开发
自定义注解
自定义注解的使用
通过反射机制读取类上的注解
需求,给你一个包名,包中有很多对象,然后将该包下实现了@component注解的类存到一个map集合中,其中注解ID为key,实例化后的对象为value值;
Spring声明Bean注解
Spring注解使用
选择实例化Bean
负责注入的注解
@value注解
@autowired注解
使用@autowired注解的方式解决注入非简单类型的数据,默认是根据类型装配的;注意点有下面两点:
如何解决上面的问题
@Resource注解
@Resource VS @autowired
spring.xml也变成注解类
Spring注解式开发
首先回顾注解相关知识点,
-
什么是注解?
-
注解的定义格式?
-
注解属性值的定义?
-
如何使用注解?
自定义注解

自定义注解的使用

通过反射机制读取类上的注解

需求,给你一个包名,包中有很多对象,然后将该包下实现了@component注解的类存到一个map集合中,其中注解ID为key,实例化后的对象为value值;


Spring声明Bean注解
这里插入一个知识点,其实注解就是元数据,第一次接触元数据是在JDBC中,所谓元注解就是修饰数据的数据,这里的注解和xml配置信息也是元注解,他们都是为了修饰数据;
在Spring中声明容器管理的Bean的注解有四个,
-
@component
-
@service
-
@controller
-
@repository
其中只有component注解为原始注解,但是为了提高可读性,又给他起了下面三个别名;源码如下:
@Target(value = {ElementType.TYPE})//target是为了指定注解能够出现的地方;@Retention(value = RetentionPolicy.RUNTIME)public @interface Component {String value();}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Controller {@AliasFor(annotation = Component.class)String value() default "";}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Service {@AliasFor(annotation = Component.class)String value() default "";}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Repository {@AliasFor(annotation = Component.class)String value() default "";}
Spring注解使用
使用注解的前期步骤:
-
加入aop依赖(引入Spring-context即可,它里面包含了Spring-aop)
-
在配置文件中添加context命名空间
<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"></beans> -
在配置文件中指定扫描的包
<context:component-scan base-package="com.powernode.spring6.bean"/>//如果出现多个包的情况,可以声明他们的共同父类,或者通过逗号的方式,同时声明多个包 -
在Bean类上使用注解
在Bean类上使用注解的几个小细节;1,在注解的使用中,如果添加的是value属性,其中value可以省略,只需要写对应的值即可;2,如果我们在使用注解时,不指定value属性的值时,Spring会给我自动创建一个属性值(采用默认方式),即Bean类的名字首字母小写
选择实例化Bean
有时候我们有这样的需求,将某个包下添加了@component注解的Bean单独实例化,其他的Bean都不实例化,如何解决;
Spring为我们提供了两种方式,use-default-filter属性值为false或者true
<context:component-scan base-package="com.powernode.spring6.bean3" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>
添加use-default-filter属性,true时表示采用Spring默认规则,实例化被四个注解标注的Bean;
false表示,不在使用默认的实例化规则,全部都不实例化,如果想要实例化某个注解,就需要配置子标签context:include-filter,并在其中声明需要实例化的注解;
负责注入的注解
前面说了实例化Bean的注解@component,现在说替代set注入或者构造函数注入的注解;
@value注解
对于简单类型,都可以使用value注解,但是这种注解目前是硬编码;耦合度太高,我也不知道后面会咋弄;直接在添加了@component注解的类属性上添加@value注解;
@Componentpublic class User {@Value(value = "zhangsan")private String name;@Value("20")private int age;}}
这种注入方式不依赖get\set方法,而且@value注解可以放在属性上、set方法上、构造方法上、或者构造方法的形参上;
@autowired注解
对于简单类型我们使用@value注解,那么对于复杂类型我们就使用@autowired注解;这种方式是自动装配,在之前我们接触过基于xml文件的自动装配,他是通过给Bean标签中添加autowire属性开启自动装配功能,然后他的属性值就会开始自动装配,底层调用的是set方法,是通过方法名来自动装配的,演示案例:
-
<bean id="userService" class="com.powernode.spring6.service.UserService" autowire="byName"/><bean id="aaa" class="com.powernode.spring6.dao.UserDao"/>public class UserService {// 这里没修改private UserDao aaa;/*public void setAaa(UserDao aaa) {this.aaa = aaa;}*/// set方法名变化了,就无法自动装配了public void setDao(UserDao aaa){this.aaa = aaa;}public void save(){aaa.insert();}}使用autowire属性为byName这种自动装配时必须注意set方法名,还有一种是根据类型自动装配,但是此时需要注意的是符合条件的实现类必须只有一个;
-
无论是byName还是byType,在装配的时候都是基于set方法的。而采用注解方式时就不依赖set方法了;
使用@autowired注解的方式解决注入非简单类型的数据,默认是根据类型装配的;注意点有下面两点:
-
第一处:该注解可以标注在哪里?
-
-
构造方法上
-
方法上
-
形参上
-
属性上
-
注解上
-
-
-
<span style="color:red">第二处:该注解有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,如果不存在则报错。如果required属性设置为false,表示注入的Bean存在或者不存在都没关系,存在的话就注入,不存在的话,也不报错。</span>
由于@autowired注解采用的是默认的方式也就是byType类型,所以实习类必须只有一个,否则会报错;
如何解决上面的问题
配合@Qualifier注解同时使用,在@Qualifier注解中指明Bean标签的名称即可;
@Autowired@Qualifier("userDaoForOracle") // 这个是bean的名字。public void setUserDao(UserDao userDao) {this.userDao = userDao;}
总结:
-
@Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
-
当带参数的构造方法只有一个,@Autowired注解可以省略。多个的话就会报错
-
@Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。
@Resource注解
这个注解使用的最广泛,最受欢迎,同样他的作用也是完成非简单类型的注入,
@Resource VS @autowired
@Resource注解也可以完成非简单类型注入。那它和@Autowired注解有什么区别?
-
@Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-250标准中制定的注解类型。JSR是Java规范提案。)
-
@Autowired注解是Spring框架自己的。
-
@Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
-
@Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
-
@Resource注解用在属性上、setter方法上。
-
@Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。
@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。】
<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version></dependency>
spring.xml也变成注解类
所谓的全注解开发就是不再使用spring配置文件了。写一个配置类来代替配置文件。
<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.powernode.spring6.dao,com.powernode.spring6.service"/></beans>
二者比较
@Configuration@ComponentScan({"com.powernode.spring6.dao", "com.powernode.spring6.service"})public class Spring6Configuration {}
但是相应的测试程序就需要改变了:
@Testpublic void testNoXml(){ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Spring6Configuration.class);UserService userService = applicationContext.getBean("userService", UserService.class);userService.save();}
ClassPathXmlApplicationContext 类换成了 AnnotationConfigApplicationContext
他日若遂凌云志,敢笑黄巢不丈夫,加油!!!
相关文章:
【Spring篇】Spring注解式开发
本文根据哔哩哔哩课程内容结合自己自学所得,用于自己复习,如有错误欢迎指正; 我在想用一句话激励我自己努力学习,却想不出来什么惊为天人、精妙绝伦的句子,脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”&am…...
14.(vue3.x+vite)组件间通信方式之pinia
前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…...
DolphinDB 浙商银行 | 第二期现场培训圆满结束
自 DolphinDB 高级工程师计划开展以来,客户们纷纷响应,除了定期收看我们每周三开设的线上公开课外,也有部分客户报名参加了 “总部工程师培训计划” 。 上周,我们迎来了总部培训的第二期学员:来自浙商银行的4位策略研…...
DBS note4:Buffer Management
目录 1、介绍 2、缓冲池 3、处理页面请求 4、LRU替换和时钟策略 1)顺序扫描性能 - LRU 5、最近最常使用替换策略(MRU Replacement) 1)Sequential Scanning Performance - MRU 6、练习题 1)判断真假 2…...
Linux 中 .tar 和 tar.gz 的区别
1、前言 有时候你会发现,即便是有些拥有 3 年左右工作经验的运维或开发工程师对 .tar 和 .tar.gz 的区别并不是很清楚。.tar 和 .tar.gz 是在 Linux 系统中用于打包和压缩文件的两种常见格式。它们之间的主要区别在于压缩算法和文件扩展名。 2、区别 .tar .tar 是…...
区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用
视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等,AI智能分析技术无处不在。在某些场景中,重点区域的人数统计与…...
asp.net mvc点餐系统餐厅管理系统
1. 主要功能 ① 管理员、收银员、厨师的登录 ② 管理员查看、添加、删除菜品类型 ③ 管理员查看、添加、删除菜品,对菜品信息进行简介和封面的修改 ④ 收银员浏览、搜索菜品,加入购物车后进行结算,生成订单 ⑤ 厨师查看待完成菜品信息…...
SpringBoot 使用多SqlSessionFactory下的事务问题
如下配置了两个数据源: spring:datasource:ds1:jdbc-url: jdbc:mysql://localhost:3307/spring-boot-demos?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8&useSSLfalse&allowPublicKeyRetrievaltrueusername: rootpassword: passwordd…...
浏览器内置NoSQL数据库IndexedDB
IndexedDB - 浏览器内容数据库 indexedDB 是一种浏览器内置的NoSQL数据库,它使用键值对存储数据,用于在客户端存储大量结构化数据。它支持离线应用程序和高效的数据检索,可以在 Web 应用程序中替代传统的 cookie 和 localStorage。 IndexDB是…...
网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍
应用层 应用层为应用软件提供接口,使应用程序能够使用网络服务。应用层协议会指定使用相应的传输层协议,以及传输层所使用的端口等。TCP/IP每一层都让数据得以通过网络进行传输,这些层之间使用PDU ( Paket Data Unit,协议数据单元)彼此交换信…...
万宾科技智能井盖传感器,预防城市道路安全
随着城市交通的不断发展和城市化进程的加速推进,城市道路安全问题日益凸显。市政井盖作为城市道路的一部分,承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施,补足传统管理方式的…...
GCC/Make/CMake 工具链
阅读前可以思考的问题:(答案在文章的最后面,小白可以略过) GCC/Make/CMake是什么关系? 一个C程序编译为一个可执行文件,需要哪些过程? #include语句所引入的库,如何才能找到对应的完整源代码文…...
GO抽象工厂模式
既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例,提取产品的共性,提高代码的内聚性, 就是抽象工厂模式要干的。在抽象工厂中,依然是不同产品对应不同的工厂类,但可以尽可能将具有相同共性的产品类别合在一起…...
Linux 磁盘/分区/修复 命令
目录 1. lsblk(list block devices) 2. fdisk(fragment disk) 3. gdisk 4. mkfs(make filesystem) 5. df(display file-system disk space usage) 6. du 7. fsck(file-sy…...
php一句话木马免杀
php一句话木马免杀 针对于php一句话木马做免杀: 利用php动态函数的特性,将危险函数拆分成字符,最终使用字符串拼接的方式,然后重新拼接,后加括号执行代码,并且可以使用花指令进行包装,如无限i…...
深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…...
轻松整理文件夹,将视频文件全部归类到另一个文件夹!
如果你需要整理文件夹中的文件,将同一类别的文件归纳到一起,可以更加方便地管理和查找。现在,我们有一个简单而实用的方法,可以将文件夹中的所有视频文件归类到另一个文件夹中,让你的文件管理更加有序和高效。 首先&am…...
存储服务器特征是什么
存储服务器和普通服务器是有差别的,配置方式不同,因为存储服务器是为特定目标设计的,通常存储服务器是独立的单元,大多数时候是被设计成4U机架式,存储服务器一般是单机运作的,不与其他服务器连接。今天小编…...
Conditional GAN
Text-to-Image 对于根据文字生成图像的问题,传统的做法就是训练一个NN,然后输入一段文字,输出对应一个图片,输出图片与目标图片越接近越好。存在的问题就是,比如火车对应的图片有很多张,如果用传统的NN来训…...
OOM问题排查+Jvm优化
OOM问题排查: 1、top命令:查看cpu和内存的使用情况。 2、jstat命令:查看YGC和FGC情况,一般都是老年代不够用。导致OOM 3、jmap命令: 查看哪个类的实例过多,以每个类占用多少了内存。4、jstack 查看线程与线程之间的阻…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

