Spring IoC容器之常见常用注解以及注解编程模型简介
一、全文概览
本篇文章主要学习记录Spring中的核心注解,罗列常见常用的注解以及Spring中的注解编程模型介绍

二、核心注解
1、Spring模式注解
| 常用注解 | 场景描述 | Spring起始支持版本 |
|---|---|---|
| @Component | 通用组件模式注解,是所有组件类型注解的元注解 | Spring 2.5 |
| @Repository | 数据仓库模式注解,最初由域驱动设计(Evans,2003)定义为"模拟对象集合的封装存储、检索和搜索行为的机制"。 | Spring 2.0 |
| @Service | 服务类组件模式注解 | Spring 2.5 |
| @Controller | Web控制器组件模式注解 | Spring 2.5 |
| @Configuration | 配置类模式注解 | Spring 3.0 |
2、Spring容器装配注解
| 常用注解 | 场景描述 | Spring起始支持版本 |
|---|---|---|
| @ImportResource | 导入指定路径的配置文件,与XML元素<import>作用相同 | Spring 2.5 |
| @Import | 导入Configuration配置类 | Spring 2.5 |
| @ComponentScan | 扫描指定包下标注Spring模式注解的类 | Spring 3.1 |
| @Bean | 向容器中注册Bean,与XML元素<bean>作用相同 | Spring 3.0 |
3、Spring依赖注入注解
| 常用注解 | 场景描述 | Spring起始支持版本 |
|---|---|---|
| @Autowired | Bean依赖注入,支持多种注入方式,例如标注在构造器、普通方法、字段等 | Spring 2.5 |
| @Qualifier | 与@Autowired配合使用,支持细粒度的Bean注入 | Spring 2.5 |
| @Value | 多用于注入外部化配置,例如xx.properties中的user.name=markus,可以通过@Value((“${user.name}”))注入到指定的字段中 | Spring 3.0 |
4、Spring条件注解
| 常用注解 | 场景描述 | Spring起始支持版本 |
|---|---|---|
| @Profile | 基于配置条件的注解,常用与指定环境,在环境符合条件下注册 | Spring 3.1 |
| @Conditional | 只有当所有指定条件都匹配时,组件才有资格注册,条件是可以在注册bean定义之前以编程方式确定的任何状态 | Spring 4 |
5、JSR注解
| 常用注解 | 场景描述 | Spring起始支持 |
|---|---|---|
| @Inject | 与@Autowired作用相同用于Bean注入 | Spring 2.5 |
| @Resource | 与@Autowired作用相同用于Bean注入 | Spring 2.5 |
| @PostConstruct | 标注在自定义方法上,在Bean初始化阶段执行 | Spring 2.5 |
| @PreDestroy | 标注在自定义销毁前执行方法上,在Bean销毁前执行 | Spring 2.5 |
更多JSR注解
三、注解编程模型
多年来,Spring 框架不断开发其对注解、元注解和组合注解的支持。下面就介绍下关于元注解、模式注解、组合注解、注解属性别名和覆盖相关的知识点
原文:Spring Annotation Programming Model
1、元注解
Spring原文:A meta-annotation is an annotation that is declared on another annotation.
元注解就是标注在另一个注解上的注解,例如任何标注为文档化的注解都使用 java.lang.annotation 包中的 @Documented 进行元注解。
// Target、Retention、Documented均为元注解
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {/*** Declares whether the annotated dependency is required.* <p>Defaults to {@code true}.*/boolean required() default true;}
2、模式注解
Spring原文:A stereotype annotation is an annotation that is used to declare the role that a component plays within the application.
如果直译 stereotype annotation 则为:刻板印象的注解。似乎有些突兀,我们看后面的解释是它是用来声明一个组件在应用中发挥的角色,例如被@Repository标注的类,我们就认为它是DAO或者数据持久化对象,它又似乎是一种我们对这些特殊注解的刻板印象,见名知意!小马哥称它为模式注解,这里我理解模式就是一种特定规范,似乎这样翻译也是合理的。不管如何翻译,我们能够知道它的含义即可。
3、组合注解
Spring原文:A composed annotation is an annotation that is meta-annotated with one or more annotations with the intent of combining the behavior associated with those meta-annotations into a single custom annotation.
组合注解比较好理解,就是通过一个或更多的注解标注在一个单个注解上形成一个组合行为,我们称这个单个的自定义的注解为组合注解,例如@RestController即是@ResponseBody和@Controller的组合
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {/*** The value may indicate a suggestion for a logical component name,* to be turned into a Spring bean in case of an autodetected component.* @return the suggested component name, if any (or empty String otherwise)* @since 4.0.1*/@AliasFor(annotation = Controller.class)String value() default "";}
4、注解属性别名和覆盖
a、属性别名
Spring原文:An attribute alias is an alias from one annotation attribute to another annotation attribute.
- Explicit Aliases
- Implicit Aliases
- Transitive Implicit Aliases
属性别名是一个注解属性到另一个注解属性的别名映射,别名又分为:显式别名、隐式别名以及传递隐式别名。
- 显式别名即为:一个注解中的两个属性通过@AliasFor声明为彼此的别名,则它们是显式别名。
- 隐式别名即为:一个注解中的两个或多个属性通过@AliasFor声明为对元注解中同一属性的显式覆盖,则它们是隐式别名。
- 传递隐式别名即为:给定一个注解中两个或多个属性,这些属性通过@AliasFor声明为元注解中属性的显示覆盖,如果这些属性根据传递性法则有效的覆盖元注解中的相同属性,则它们是可传递的隐式别名。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {@AliasFor("basePackages") // 显式别名String[] value() default {};@AliasFor("value") // 显式别名String[] basePackages() default {};
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@ComponentScan
public @interface MyComponentScan {@AliasFor(value = "value", annotation = ComponentScan.class) // 隐式别名String[] scanBasePackages() default {"#"};
}
b、属性覆盖
Spring原文:An attribute override is an annotation attribute that overrides (or shadows) an annotation attribute in a meta-annotation.
- Implicit Overrides
- Explicit Overrides
- Transitive Explicit Overrides
属性覆盖是一个注解属性覆盖(或隐藏)元注解中的注解属性的行为,该行为又分为显式覆盖、隐式覆盖、传递显式覆盖。
- 隐式覆盖即为:给定两个注解@One和@Two,两者均有属性A,如果@One将@Two作为元注解,那么我们就是注解@One的属性A是对注解@Two的属性A的隐式覆盖。
- 显式覆盖即为:通过@AliasFor将属性A声明为元注解中属性B的别名,则A是B的显示覆盖。
- 传递显式覆盖即为:给定三个注解@One、@Two和@Three,如果@One中属性A是注解@Two属性B的显式覆盖,而@Two的属性B又是@Three的属性C的显式覆盖,则称@One的属性A是@Three属性C的传递显示覆盖
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@MyComponentScan
public @interface MyComponentScan2 {/*** 与 @MyComponentScan属性同名 为隐式覆盖* @return*/String[] scanBasePackages() default {};/*** 显式覆盖* @return*/@AliasFor("scanBasePackages")String[] packages() default {};
}
四、全文总结
本文主要是对Spring中常用的注解以及Spring支持的jsr注解进行了简单的罗列介绍以及对注解编程模型进行了学习记录,对注解的使用和底层原理本文未涉及,后续会增加对注解使用以及原理的介绍文章。
相关文章:
Spring IoC容器之常见常用注解以及注解编程模型简介
一、全文概览 本篇文章主要学习记录Spring中的核心注解,罗列常见常用的注解以及Spring中的注解编程模型介绍 二、核心注解 1、Spring模式注解 常用注解场景描述Spring起始支持版本Component通用组件模式注解,是所有组件类型注解的元注解Spring 2.5Repo…...
超详细讲解文件函数
超详细讲解文件函数!!!!字符输入/输出函数fgetcfputc文本行输入/输出函数fgetsfputs格式化输入/输出函数fscanffprintf二进制输入/输出函数freadfwrite打开/关闭文件函数fopenfclose字符输入/输出函数 fgetc fgetc函数可以从指定…...
【挣值分析】
名称解释 拼写解释PV计划费用,预估预算EV挣值,实际预估预算AC实际费用,实际花费CV成本偏差 (EV - AC)SV进度偏差(EV - PV)CPI成本绩效指数 (EV / AC)SPI进度绩效指数 &a…...
Python3-基础语法
Python3 基础语法 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&…...
【计算机网络】数据链路层(下)
文章目录媒体接入控制媒体接入控制-静态划分信道随机接入 CSMACD协议随机接入 CSMACA协议MAC地址MAC地址作用MAC地址格式MAC地址种类MAC地址的发送顺序单播MAC地址广播MAC地址多播MAC地址随机MAC地址IP地址区分网络编号IP地址与MAC地址的封装位置转发过程中IP地址与MAC地址的变…...
系统分析师考试大纲
系统分析师考试大纲 1.考试目标 通过本考试的合格人员应熟悉应用领域的业务,能分析用户的需求和约束条件,写出信息系统需求规格说明书,制订项目开发计划,协调信息系统开发与运行所涉及的各类人员;能指导制…...
2023上半年软考报名时间已定,你准备好了吗?
港城软考公众号于2023年2月17日发布了2023年度计算机软考工作计划,从该计划内容得知,2023年计算机软考上半年报名3月13日开始,请相关报考人员提前做好报名准备工作。 其他各省市还暂未公布2023上半年软考报名时间,每年都有很多…...
DPDK — Userspace PMD 源码分析
目录 文章目录目录PMD driver 通过 IGB_UIO 与 UIO 进行交互注册一个 UIO 设备PMD 的应用层实现PMD 同样支持中断处理方式PMD driver 通过 IGB_UIO 与 UIO 进行交互 IGB_UIO 内核模块的另一个主要功能就是让用于态的 PMD 网卡驱动程序得以与 UIO 进行交互。对于 PMD 的实现来说…...
javase基础学习(终)
9、网络通信协议 /* InetAddress类的常用方法 1、getLocalHost()public static InetAddress getLocalHost() throws UnknownHostException返回本地主机的地址。 这是通过从系统检索主机的名称,然后将该名称解析为InetAddress 。2、getByName()public static InetAd…...
Scala
1、Scala语言有什么特点?什么是函数式编程?有什么优点? 1、scala语⾔集成⾯向对象和函数式编程 2、函数式编程是⼀种典范,将电脑的运算视作是函数的运算 3、与过程化编程相⽐,函数式编程⾥的函数计算可以随时调⽤&…...
《数据分析方法论和业务实战》读书笔记
《数据分析方法和业务实战》读书笔记 共9章:前两章入门,3-7章介绍基本方法,8章从项目实战介绍数据分析,9章答疑常见问题。 1 数据分析基础 数据分析的完整流程 数据-》信息-〉了解现状-》发现原因-〉获取洞察-》问题机会-〉驱动…...
华为OD机试 - 射击比赛(Python)
射击比赛 题目 给定一个射击比赛成绩单 包含多个选手若干次射击的成绩分数 请对每个选手按其最高三个分数之和进行降序排名 输出降序排名后的选手 ID 序列 条件如下: 一个选手可以有多个射击成绩的分数 且次序不固定如果一个选手成绩小于三个 则认为选手的所有成绩无效 排名忽…...
uniapp自定义验证码输入框,隐藏光标
一. 前言 先看下使用场景效果图: 点击输入框唤起键盘,蓝框就相当于input的光标,验证码输入错误或者不符合格式要求会将字体以及边框改成红色提示,持续1s,然后清空数据,恢复原边框样式;5位验证…...
基于SSM框架的生活论坛系统的设计与实现
基于SSM框架的生活论坛系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...
spring注解使用中常见的概念性问题
Spring注解使用中常见的概念性问题Configuration有什么用?Configuration和XML有什么区别?哪种好?Autowired 、 Inject、Resource 之间有什么区别?Value、PropertySource 和 Configuration?Spring如何处理带Configurati…...
Module理解及使用
ES6的模块化设计思想是静态化,也就是说,在编译的时候确定模块的依赖关系,以及输出输出入的变量。而CommonJS和AMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显示指定输出的代码,再通过import命令输入。…...
ngix 常用配置之 location 匹配规则
大家好,我是 17。 今天和大家详细聊聊 nginx 的 location 匹配规则 location 匹配规则 匹配规则在后面的 try_files 中有举例 location 按如下优先级匹配 绝对匹配,一个字符也不能差^~ 前缀匹配~(区分大小写), ~*(不…...
chatGPT与人形机器人,高泽龙接受中国经营报采访谈二者发展
1.相较于Chatgpt,人形机器人的市场前景有多大?答:人形机器人的市场前景可以用“无限大”来形容,这看起来很夸张而且并不合理,其实是客观而且中肯的。因为这个问题就仿佛是五十年前,人们问“未来的电脑市场有…...
进程同步——读者-写者问题
读者-写者问题 互斥制约与合作制约双重关系的进程同步问题描述是: 一个被多个进程共享的文件、记录或数据结构,允许进程对其执行读、写操作。读进程称为读者,写进程称为写者。其允许多个进程同时读取,但只要有一个进程在读&#…...
Android自动化配置
1 搭建APPIUM环境 1.1 安装node.js Appium是使用nodejs实现的,所以node是解释器,需要第一步安装好 node.js的安装包下载地址: https://nodejs.org/en/download/ 注意:node.js的安装包的下载在官网有两种版本,建议大…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
