IOC课程整理-18 Spring注解

1. Spring 注解驱动编程发展历程

2. Spring 核心注解场景分类

3. Spring 注解编程模型

https://github.com/spring-projects/spring-framework/wiki/Spring-Annotation-Programming-Model

4. Spring 元注解(Meta-Annotations)

元注解(Meta-Annotations)是指用于定义注解的注解。在Spring框架中,有几个常用的元注解,用于定义自定义注解。下面是几个常见的Spring元注解:

1. @Retention: 用于指定自定义注解的生命周期。常用的取值有:
   - RetentionPolicy.SOURCE: 编译时注解,不会存在于编译后的字节码文件中。
   - RetentionPolicy.CLASS: 编译时注解,会存在于编译后的字节码文件中,但在运行时不可见。
   - RetentionPolicy.RUNTIME: 运行时注解,会存在于编译后的字节码文件中,且在运行时可见。

2. @Target: 用于指定自定义注解可以应用的目标元素类型。常用的取值有:
   - ElementType.TYPE: 可以应用于类、接口或枚举类型。
   - ElementType.METHOD: 可以应用于方法。
   - ElementType.FIELD: 可以应用于字段。
   - ElementType.PARAMETER: 可以应用于方法的参数。
   - ElementType.CONSTRUCTOR: 可以应用于构造函数。
   - ElementType.ANNOTATION_TYPE: 可以应用于注解类型。
   - ElementType.PACKAGE: 可以应用于包。

3. @Documented: 用于指定自定义注解是否包含在Java文档中。如果一个注解被@Documented注解修饰,那么使用该注解的元素及注解的信息将会出现在生成的Java文档中。

4. @Inherited: 用于指定子类是否继承父类的注解。如果一个注解被@Inherited注解修饰,并且父类中有该注解,那么子类也会继承该注解。

这些是常见的Spring元注解,它们提供了一种灵活的机制来定义自定义注解,并指定注解的作用范围、生命周期等特性,以及实现依赖注入和组件管理等功能。通过使用这些元注解,我们可以更加灵活地定义和使用自定义注解,并与Spring框架进行集成。

5. Spring 模式注解(Stereotype Annotations)

Spring框架提供了一些用于定义Bean的模式注解,这些注解可以用于更细粒度地指定如何创建和管理Bean。下面是几个常见的Spring模式注解:

1. @Component: 通用的组件注解,用于标记一个类为组件Bean。它是其他模式注解的基础,通常作为最顶层的注解使用。

2. @Repository: 用于标记一个类为数据访问组件,即持久层组件。它通常用于DAO(数据访问对象)类。

3. @Service: 用于标记一个类为业务逻辑组件,即服务层组件。它通常用于包含业务逻辑的类。

4. @Controller: 用于标记一个类为控制器,即Web MVC控制器组件。它通常用于处理HTTP请求并生成响应。

5. @RestController: 用于标记一个类为RESTful风格的控制器,它结合了@Controller和@ResponseBody注解的功能。常用于构建RESTful API。

6. @Configuration: 用于标记一个类为配置类,它通常与@Bean注解一起使用,用于定义Spring容器中的Bean。

这些模式注解提供了一种更具语义的方式来描述Bean的角色和用途,同时也方便了Spring容器在扫描和组织Bean时的处理逻辑。通过使用这些模式注解,我们可以更好地组织和管理应用程序的各个组件,并且能够更好地表达各个组件之间的复杂关系。

6. Spring 组合注解(Composed Annotations)

在Spring框架中,可以使用组合注解(Composite Annotation)来将多个注解组合在一起,以简化配置,并实现对特定功能的快速应用。组合注解通过在一个自定义注解上使用多个其他注解来实现。

下面是几个常用的Spring组合注解及其功能:

1. @RestController: 它是一个组合注解,将@Controller与@ResponseBody组合在一起。使用@RestController注解的类可以处理HTTP请求并直接返回响应,适用于构建RESTful风格的控制器。

2. @Configuration: 它是一个组合注解,将@Component与@Bean组合在一起。使用@Configuration注解的类用于定义Spring容器中的Bean,可以通过@Bean注解定义Bean,并通过@ComponentScan注解来扫描并注册其他组件。

3. @EnableScheduling: 它是一个组合注解,将@Configuration与@EnableScheduling组合在一起。使用@EnableScheduling注解的类用于开启Spring的任务调度功能,可以使用@Scheduled注解来定义定时任务。

4. @EnableTransactionManagement: 它是一个组合注解,将@Configuration与@EnableTransactionManagement组合在一起。使用@EnableTransactionManagement注解的类用于开启Spring的事务管理功能,可以使用@Transactional注解在方法或类级别上应用事务管理。

5. @SpringBootApplication: 它是一个组合注解,将@Configuration、@EnableAutoConfiguration和@ComponentScan组合在一起。使用@SpringBootApplication注解的类是Spring Boot应用程序的主类,用于自动配置Spring与Spring Boot的各种功能。

通过使用这些组合注解,可以将多个相关的注解组合在一起,以简化配置,并快速应用特定的功能。这使得开发者能够更加便捷地使用Spring框架提供的各种功能,并提高开发效率。同时,组合注解也提供了一种更加语义化和可读性好的方式来定义和使用注解,使代码更加清晰和易于理解。

7. Spring 注解属性别名(Attribute Aliases)

在Spring框架中,有一些注解提供了属性别名的功能,即可以为属性提供多个名称,以便开发者可以使用不同的名称来配置相同的属性。这样可以增加配置的灵活性和可读性。

1.同一注解相互别名=显示别名

2.对显示注解相同属性进行覆盖=隐式注解

3.对隐式注解相同属性进行覆盖=传递隐式注解

下面是一些使用属性别名的常见Spring注解:

1. @Value(alias = "anotherName"): 用于在Spring容器中注入值到属性上。它的alias属性可以用于为注入的值指定多个别名。

2. @Qualifier(alias = "anotherName"): 用于指定在存在多个相同类型的Bean时,通过名称进行注入。它的alias属性可以用于为Bean指定多个别名。

3. @RequestMapping(alias = {"url1", "url2"}): 用于映射HTTP请求的URL路径到处理方法上。它的alias属性可以用于为URL路径指定多个别名。

4. @Conditional(alias = "anotherCondition"): 用于基于条件选择性地加载Bean或配置。它的alias属性可以用于为条件指定多个别名。

使用属性别名可以使代码更加清晰和易于理解,同时提供了更多的配置灵活性。开发者可以使用不同的属性别名来配置属性,根据具体的使用场景和需求进行选择。这使得配置文件更加易读,也方便了后续的维护和修改。

8. Spring 注解属性覆盖(Attribute Overrides )

在Spring框架中,属性覆盖(Attribute Overrides)是指子类或派生类中使用注解覆盖父类或接口中相同属性的注解配置。Spring框架提供了一些特定注解,可以在派生类中对父类的属性注解进行覆盖,进而进行个性化配置。

以下是几个常见的使用属性覆盖的Spring注解:

1. @OverrideAutowired:用于在派生类中覆盖父类中的@Autowired注解。通过使用该注解,派生类可以对父类的依赖注入进行覆盖,实现自定义的注入行为。

2. @OverrideQualifier:用于在派生类中覆盖父类中的@Qualifier注解。通过使用该注解,派生类可以对父类的依赖进行更精确的注入,实现个性化的依赖解析。

3. @OverridePrimary:用于在派生类中覆盖父类中的@Primary注解。通过使用该注解,派生类可以覆盖父类中的主要Bean定义,实现自定义的首选Bean注入。

4. @OverrideScope:用于在派生类中覆盖父类中的@Scope注解。通过使用该注解,派生类可以对父类的Bean作用域进行覆盖,实现个性化的作用域配置。

使用属性覆盖可以使派生类在继承父类或实现接口的基础上,对父类或接口中的属性注解进行个性化配置,以满足自身的需求。这种机制减少了重复的代码编写,提高了代码的可维护性和扩展性。同时,属性覆盖还加强了框架的灵活性,使开发者能够更加方便地定制和调整框架的行为。

9. Spring @Enable 模块驱动

10.. Spring 条件注解 

在Spring框架中,条件注解(Conditional Annotation)是一种特殊的注解,用于根据条件来选择性地加载某些Bean、配置或组件。条件注解使得开发者能够基于不同的条件来决定是否应用某个配置或加载某个Bean,从而增加了应用灵活性和可配置性。

通过使用这些条件注解,开发者可以根据不同的条件来条件化地加载和配置Bean、组件或其他Spring相关的元素。这使得应用能够根据不同的环境、配置或需求动态地选择性地加载和应用特定部分的代码。条件注解提供了一种灵活且可扩展的机制,使得应用能够根据具体的条件进行个性化配置,从而满足不同的需求。

 11. 课外资料

12. 面试题精选

- Spring 模式注解有哪些

@EventListener 的工作原理?

@EventListener 是 Spring 框架中的一个注解,用于标记方法作为事件监听器。它用于监听和处理由 Spring 应用程序触发的事件。@EventListener 注解的工作原理如下:

1. 注册监听器:在 Spring 容器中,可以通过使用 @EventListener 注解将监听器方法注册为事件监听器。这些监听器方法通常位于 Spring Bean 中。

2. 发布事件:当某个事件发生时,Spring 应用程序可以通过触发或发布该事件。事件通常是一个自定义的类型,它可以扩展 Spring 框架中的 ApplicationEvent 类。

3. 事件传播:一旦事件被发布,Spring 框架就会遍历容器中所有的监听器方法,并检查它们是否与发布的事件类型匹配。

4. 事件处理:匹配的事件监听器方法将被调用,并且传递相应的事件作为方法参数。监听器方法可以执行自定义逻辑来处理事件。

需要注意的是,@EventListener 注解可以用于任何 bean 的公共方法上,而不仅仅限于实现了特定接口的类。这样可以在不使用额外的接口或配置的情况下,实现事件监听和处理的功能。

总结而言,@EventListener 注解通过在 Spring 容器中注册监听器方法,并在事件发布时匹配和调用这些方法,实现了事件的监听和处理功能。这种机制使得事件的处理可以更加简单和灵活,同时能够实现松耦合的设计,提高代码的可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/108195.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE4 体积云制作 学习笔记

首先Noise本来就是一张噪点图 云的扰动不能太大,将Scale调小,并将InputMin调整为0 形成这样一张扰动图 扰动需要根据材质在世界的位置进行调整,所以Position需要加上WorldPosition 材质在不同世界位置,噪点不同 除以一个数&#…

ETCD备份与恢复

文章目录 主要内容一.备份1.先安装etcd客户端代码如下(示例): 2.备份成文件并查看代码如下(示例): 3.解释 二.恢复1.先停止服务代码如下(示例): 2.删除现有ETCD,并恢复数据代码如下(…

前端 读取/导入 Excel文档

情况: 需要通过Excel表,将数据导入到数据库,但是后台人员出差了,我又只会PHP,没用过node,所以只能前端导入Excel文件,然后循环调用后台的单条添加接口了。 库: Excel.js&#xff08…

MySQL 约束条件,关键字练习,其他语句

创建表的完整语法 create table t1( id int, name varchar(43), age int ); create table 库名.表名( 字段名1 数据类型 约束条件 约束条件 约束条件 约束条件, 字段名2 数据类型 约束条件 约束条件 约束条件 约束条件, 字段名3 数据类型 约束条件 约束…

NPM【问题 01】npm i node-sass@4.14.1报错not found: python2及Cannot download问题处理

node-sass安装问题处理 1.问题2.处理2.1 方案一【我的环境失败】2.2 方案二【成功】2.3 方案三【成功】 1.问题 gyp verb which failed Error: not found: python2 # 1.添加Python27的安装路径到环境变量 gyp verb check python checking for Python executable "python…

Unity C#中LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查

LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查 介绍Lua表lua表初始化lua移除引用lua中向表中添加数据lua中表中移除数据lua表中连接数据lua表中数据排序获取lua表长度获取表中最大值 UnityC#中LuaTableUnityC#中LuaArrayTable、LuaDictTable、LuaDictTable<K,V>…

SpringCloud复习:(3)LoadBalancerInterceptor

使用Ribbon时&#xff0c;execute方法会由RibbonLoadBalancerClient类来实现 它会调用重载的execute方法 getLoadBalancer默认会返回ZoneAwareLoadBalancer&#xff08;基类是BaseLoadBalancer).此处调用的getServer方法就会根据负载均衡策略选择适当的服务器来为下一步的htt…

【Unity】RenderFeature应用(简单场景扫描效果)

【Unity】RenderFeature应用&#xff08;简单场景扫描效果&#xff09; RenderFeature 是一个用于渲染图形的概念&#xff0c;通常在图形引擎或游戏引擎中使用。它是一个模块化的组件&#xff0c;负责处理特定的渲染功能&#xff0c;例如阴影、光照、粒子效果等。 点击地面生成…

【网络】序列化反序列化

序列化反序列化 一、序列化反序列化1、概念2、序列化作用3、序列化框架的选择 二、Json1、介绍2、简单使用 一、序列化反序列化 1、概念 在前文《网络编程套接字》中&#xff0c;我们实现了服务器与客户端之间的字符串通信&#xff0c;这是非常简单的通信&#xff0c;在实际使…

p5.js 到底怎么设置背景图?

本文简介 点赞 关注 收藏 学会了 在 《p5.js 光速入门》 里我们学过加载图片元素&#xff0c;学过过背景色的用法&#xff0c;但当时没提到背景图要怎么使用。 本文就把背景图这部分内容补充完整&#xff0c;并且会提到在 p5.js 里使用背景图的一些注意点。 背景图的用法…

pgsql 分组查询,每组取10条

需求&#xff1a; 按照表的字段分组&#xff0c;然后每组取10条结果&#xff0c;返回即可 sql 如下&#xff1a; SELECT* FROM (SELECT chk_id,feature_id,task_id, ROW_NUMBER () OVER (PARTITION BY chk_id ORDER BY chk_id) AS row_num FROM ics_check_report WHERE task…

中微爱芯74逻辑兼容替代TI/ON/NXP工规品质型号全

这里写自定义目录标题 工业级型号全产品线概述![在这里插入图片描述](https://img-blog.csdnimg.cn/097ef810b2234f07b0c0c1e962a73761.png)批量应用行业头部客户兼容替代封装对照逻辑参数对比电平转换系列型号对照HC/HCT 系列型号对照AHC/AHCT 系列型号对照LV/LVC 系列型号对照…

我是如何快速从python小白达到20k?

前言 首先说一下我自己的情况&#xff0c;我之前是学JAVA的&#xff0c;JAVA亡了只好转行python 很多新手就在好奇自己明明都认认真真的学习了python&#xff0c;但就是感觉很杂很乱&#xff0c;按照我这个流程&#xff0c;至少可以省一大半时间&#xff0c;完整的知识体系很重…

数据可视化报表分享:区域管理驾驶舱

在零售数据分析中&#xff0c;区域管理驾驶舱报表是用来分析企业运营数据&#xff0c;以制定销售策略和提高利润。因此这张报表需要整合大量数据&#xff0c;数据整合、分析、指标计算的工作量极大&#xff0c;在讲究高效率、高度及时性的大数据时代&#xff0c;BI数据可视化分…

Vue 3.3.6 发布,得益于WeakMap,它更快了

性能改进和DOM节点的附加属性的类型检查使新的Vue值得更新。Vue团队确实做了很多工作。实际上&#xff0c;他们在同一天发布了两个子版本。Vue 3.3.5 和 3.3.6 都在2023年10月20日发布。 WeakMaps 其中一个得到改进的是在可能的情况下从 Maps 和 Sets 转移到WeakMaps 和WeakSet…

centos服务器搭建安装Gitlab教程使用教程

1、更新服务器&#xff1a; sudo yum update -y && sudo yum upgrade -y 2、下载Gitlab的RPM包 https://packages.gitlab.com/gitlab/gitlab-cece表示开源el表示centos 选64位el8对应CentOS8 本教程以centos8为例&#xff0c;在服务器中&#xff0c;下载centos8的…

计算机网络【CN】TCP报文段格式【20B】

序号&#xff1a;本报文段所发送的数据的第一个字节的序号确认号&#xff1a;期望收到对方下一个报文段的第一个数据字节的序号。 重要控制位&#xff1a; 紧急位URG&#xff1a;URG1时&#xff0c;标明此报文段中有紧急数据&#xff0c;是高优先级的数据&#xff0c;应尽快传送…

MediaPlayer

1、概念 MediaPlayer是Android原生的多媒体播放器&#xff0c;可以用它来实现本地或者在线音视频的播放。 2、MediaPlayer的状态 下面的图是官方给出的状态转换图&#xff0c;也可易理解为MediaPlayer的生命周期。 椭圆形&#xff1a;表示MediaPlayer的状态&#xff1b;弧形…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一&#xff1a;基于LaTeX环境方案二&#xff1a;基于KaTeX(推荐) 方案三&#xff1a;基于Matplotlib写在最后 引言 近来&#xff0c;涉及到一些公式识别的项目&#xff0c;输入是公式的图像&#xff0c;输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

基于Pytorch的驾驶员分心行为实时检测

本文使用深度学习和Pytorch(PyTorch 2.0.1\Torchvision 0.15.2)实时检测驾驶员的分心行为,并附录完整代码。 检测分心驾驶是现代汽车中最重要的功能之一。无论是自动驾驶汽车还是其它高端汽车,都配备了驾驶员监控系统,以持续跟踪驾驶员的行为。这对确保驾驶员保持目光在道路…