当前位置: 首页 > news >正文

【Spring篇】Spring注解式开发

本文根据哔哩哔哩课程内容结合自己自学所得,用于自己复习,如有错误欢迎指正;


我在想用一句话激励我自己努力学习,却想不出来什么惊为天人、精妙绝伦的句子,脑子里全是上课老师想说却没想起的四个字  “ 唯手熟尔 ”,是啊!不过唯手熟尔!


目录

Spring注解式开发

自定义注解

自定义注解的使用

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

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

Spring声明Bean注解

Spring注解使用

选择实例化Bean

负责注入的注解

@value注解

@autowired注解

使用@autowired注解的方式解决注入非简单类型的数据,默认是根据类型装配的;注意点有下面两点:

如何解决上面的问题

@Resource注解

@Resource VS @autowired

spring.xml也变成注解类


Spring注解式开发

首先回顾注解相关知识点,

  1. 什么是注解?

  2. 注解的定义格式?

  3. 注解属性值的定义?

  4. 如何使用注解?

自定义注解

自定义注解的使用

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

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

Spring声明Bean注解

这里插入一个知识点,其实注解就是元数据,第一次接触元数据是在JDBC中,所谓元注解就是修饰数据的数据,这里的注解和xml配置信息也是元注解,他们都是为了修饰数据;

在Spring中声明容器管理的Bean的注解有四个,

  1. @component

  2. @service

  3. @controller

  4. @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注解使用

使用注解的前期步骤:

  1. 加入aop依赖(引入Spring-context即可,它里面包含了Spring-aop)

  2. 在配置文件中添加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>
  3. 在配置文件中指定扫描的包

     <context:component-scan base-package="com.powernode.spring6.bean"/>//如果出现多个包的情况,可以声明他们的共同父类,或者通过逗号的方式,同时声明多个包
  4. 在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方法,是通过方法名来自动装配的,演示案例:

  1.     
     <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方法名,还有一种是根据类型自动装配,但是此时需要注意的是符合条件的实现类必须只有一个;

  2. 无论是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注解式开发

本文根据哔哩哔哩课程内容结合自己自学所得&#xff0c;用于自己复习&#xff0c;如有错误欢迎指正&#xff1b; 我在想用一句话激励我自己努力学习&#xff0c;却想不出来什么惊为天人、精妙绝伦的句子&#xff0c;脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”&am…...

14.(vue3.x+vite)组件间通信方式之pinia

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…...

DolphinDB 浙商银行 | 第二期现场培训圆满结束

自 DolphinDB 高级工程师计划开展以来&#xff0c;客户们纷纷响应&#xff0c;除了定期收看我们每周三开设的线上公开课外&#xff0c;也有部分客户报名参加了 “总部工程师培训计划” 。 上周&#xff0c;我们迎来了总部培训的第二期学员&#xff1a;来自浙商银行的4位策略研…...

DBS note4:Buffer Management

目录 1、介绍 2、缓冲池 3、处理页面请求 4、LRU替换和时钟策略 1&#xff09;顺序扫描性能 - LRU 5、最近最常使用替换策略&#xff08;MRU Replacement&#xff09; 1&#xff09;Sequential Scanning Performance - MRU 6、练习题 1&#xff09;判断真假 2&#xf…...

Linux 中 .tar 和 tar.gz 的区别

1、前言 有时候你会发现&#xff0c;即便是有些拥有 3 年左右工作经验的运维或开发工程师对 .tar 和 .tar.gz 的区别并不是很清楚。.tar 和 .tar.gz 是在 Linux 系统中用于打包和压缩文件的两种常见格式。它们之间的主要区别在于压缩算法和文件扩展名。 2、区别 .tar .tar 是…...

区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用

视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等&#xff0c;AI智能分析技术无处不在。在某些场景中&#xff0c;重点区域的人数统计与…...

asp.net mvc点餐系统餐厅管理系统

1. 主要功能 ① 管理员、收银员、厨师的登录 ② 管理员查看、添加、删除菜品类型 ③ 管理员查看、添加、删除菜品&#xff0c;对菜品信息进行简介和封面的修改 ④ 收银员浏览、搜索菜品&#xff0c;加入购物车后进行结算&#xff0c;生成订单 ⑤ 厨师查看待完成菜品信息…...

SpringBoot 使用多SqlSessionFactory下的事务问题

如下配置了两个数据源&#xff1a; spring:datasource:ds1:jdbc-url: jdbc:mysql://localhost:3307/spring-boot-demos?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8&useSSLfalse&allowPublicKeyRetrievaltrueusername: rootpassword: passwordd…...

浏览器内置NoSQL数据库IndexedDB

IndexedDB - 浏览器内容数据库 indexedDB 是一种浏览器内置的NoSQL数据库&#xff0c;它使用键值对存储数据&#xff0c;用于在客户端存储大量结构化数据。它支持离线应用程序和高效的数据检索&#xff0c;可以在 Web 应用程序中替代传统的 cookie 和 localStorage。 IndexDB是…...

网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍

应用层 应用层为应用软件提供接口&#xff0c;使应用程序能够使用网络服务。应用层协议会指定使用相应的传输层协议&#xff0c;以及传输层所使用的端口等。TCP/IP每一层都让数据得以通过网络进行传输&#xff0c;这些层之间使用PDU ( Paket Data Unit,协议数据单元)彼此交换信…...

万宾科技智能井盖传感器,预防城市道路安全

随着城市交通的不断发展和城市化进程的加速推进&#xff0c;城市道路安全问题日益凸显。市政井盖作为城市道路的一部分&#xff0c;承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施&#xff0c;补足传统管理方式的…...

GCC/Make/CMake 工具链

阅读前可以思考的问题&#xff1a;&#xff08;答案在文章的最后面,小白可以略过&#xff09; GCC/Make/CMake是什么关系&#xff1f; 一个C程序编译为一个可执行文件&#xff0c;需要哪些过程&#xff1f; #include语句所引入的库&#xff0c;如何才能找到对应的完整源代码文…...

GO抽象工厂模式

既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例&#xff0c;提取产品的共性&#xff0c;提高代码的内聚性&#xff0c; 就是抽象工厂模式要干的。在抽象工厂中&#xff0c;依然是不同产品对应不同的工厂类&#xff0c;但可以尽可能将具有相同共性的产品类别合在一起…...

Linux 磁盘/分区/修复 命令

目录 1. lsblk&#xff08;list block devices&#xff09; 2. fdisk&#xff08;fragment disk&#xff09; 3. gdisk 4. mkfs&#xff08;make filesystem&#xff09; 5. df&#xff08;display file-system disk space usage&#xff09; 6. du 7. fsck&#xff08;file-sy…...

php一句话木马免杀

php一句话木马免杀 针对于php一句话木马做免杀&#xff1a; 利用php动态函数的特性&#xff0c;将危险函数拆分成字符&#xff0c;最终使用字符串拼接的方式&#xff0c;然后重新拼接&#xff0c;后加括号执行代码&#xff0c;并且可以使用花指令进行包装&#xff0c;如无限i…...

深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…...

轻松整理文件夹,将视频文件全部归类到另一个文件夹!

如果你需要整理文件夹中的文件&#xff0c;将同一类别的文件归纳到一起&#xff0c;可以更加方便地管理和查找。现在&#xff0c;我们有一个简单而实用的方法&#xff0c;可以将文件夹中的所有视频文件归类到另一个文件夹中&#xff0c;让你的文件管理更加有序和高效。 首先&am…...

存储服务器特征是什么

存储服务器和普通服务器是有差别的&#xff0c;配置方式不同&#xff0c;因为存储服务器是为特定目标设计的&#xff0c;通常存储服务器是独立的单元&#xff0c;大多数时候是被设计成4U机架式&#xff0c;存储服务器一般是单机运作的&#xff0c;不与其他服务器连接。今天小编…...

Conditional GAN

Text-to-Image 对于根据文字生成图像的问题&#xff0c;传统的做法就是训练一个NN&#xff0c;然后输入一段文字&#xff0c;输出对应一个图片&#xff0c;输出图片与目标图片越接近越好。存在的问题就是&#xff0c;比如火车对应的图片有很多张&#xff0c;如果用传统的NN来训…...

OOM问题排查+Jvm优化

OOM问题排查&#xff1a; 1、top命令&#xff1a;查看cpu和内存的使用情况。 2、jstat命令&#xff1a;查看YGC和FGC情况&#xff0c;一般都是老年代不够用。导致OOM 3、jmap命令&#xff1a; 查看哪个类的实例过多,以每个类占用多少了内存。4、jstack 查看线程与线程之间的阻…...

Steam库存管理终极指南:5分钟掌握智能批量操作

Steam库存管理终极指南&#xff1a;5分钟掌握智能批量操作 【免费下载链接】Steam-Economy-Enhancer 中文版&#xff1a;Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/ste/Steam-Economy-Enhancer Steam Economy Enhancer…...

解锁个性化键盘革命:Cherry MX键帽3D模型完全指南

解锁个性化键盘革命&#xff1a;Cherry MX键帽3D模型完全指南 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 你是否厌倦了千篇一律的键盘外观&#xff1f;想要打造真正属于自己的机…...

基于Azure Cosmos DB与OpenAI构建企业级RAG智能问答应用实战

1. 项目概述&#xff1a;构建一个基于向量数据库的智能对话应用最近在折腾一个挺有意思的项目&#xff0c;想和大家分享一下如何用 Azure Cosmos DB 和 Azure OpenAI Service 来搭建一个真正能用的“副驾驶”应用。这个项目的核心思路&#xff0c;就是把你的数据变成 AI 能理解…...

Cursor AI开发助手功能体验优化技术探索指南

Cursor AI开发助手功能体验优化技术探索指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request limit. / …...

Android系统权限共享终极指南:Dhizuku实战与架构解析

Android系统权限共享终极指南&#xff1a;Dhizuku实战与架构解析 【免费下载链接】Dhizuku A tool that can share DeviceOwner permissions to other application. 项目地址: https://gitcode.com/gh_mirrors/dh/Dhizuku 在Android开发中&#xff0c;系统级权限一直是开…...

如何快速掌握Can-I-Take-Over-XYZ:子域名接管防御与自动化指纹校验完整指南

如何快速掌握Can-I-Take-Over-XYZ&#xff1a;子域名接管防御与自动化指纹校验完整指南 【免费下载链接】can-i-take-over-xyz "Can I take over XYZ?" — a list of services and how to claim (sub)domains with dangling DNS records. 项目地址: https://gitco…...

如何彻底解决百度网盘分享链接失效问题:秒传脚本终极指南

如何彻底解决百度网盘分享链接失效问题&#xff1a;秒传脚本终极指南 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 你是否经常遇到百度网盘分享链接失效的…...

终极指南:5步掌握KrkrzExtract XP3资源解包工具

终极指南&#xff1a;5步掌握KrkrzExtract XP3资源解包工具 【免费下载链接】KrkrzExtract The next generation of KrkrExtract 项目地址: https://gitcode.com/gh_mirrors/kr/KrkrzExtract 你是否曾经面对krkrz引擎的XP3格式资源文件感到束手无策&#xff1f;想要修改…...

虚拟电厂 + 微电网,万亿能源新赛道已来临

近期能源圈有个很有意思的现象&#xff1a;很多做虚拟电厂的企业开始布局微电网业务了&#xff0c;纷纷将微电网作为核心赛道&#xff0c;这背后绝非偶然。虚拟电厂&#xff08;VPP&#xff09;数字大脑&#xff0c;必须落地到实体微电网这个“躯体”&#xff0c;才能真正商业化…...

【AI面试临阵磨枪-40】文本切块(Chunking)策略:固定长度、语义切块、递归切块、重叠设计

一、面试题目请详细介绍 RAG 中文本切块&#xff08;Chunking&#xff09;四大核心策略&#xff1a;固定长度切块、语义切块、递归字符切块、切块重叠设计&#xff0c;分别原理、优缺点、适用场景、工程选型建议。二、知识储备1. 基础概念Chunking 文本切块把长文档切分成小块&…...