IOC课程整理-18 Spring注解

news2024/12/26 11:04:50

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 容器中注册监听器方法,并在事件发布时匹配和调用这些方法,实现了事件的监听和处理功能。这种机制使得事件的处理可以更加简单和灵活,同时能够实现松耦合的设计,提高代码的可维护性和可扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostGreSQL:JSON|JSONB数据类型

JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

先看卷积是啥,url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了,感觉似懂非懂 下一个参考视频:https://www.y…

linux PELT算法中的load计算

滑窗平均的累加计算 权重y按滑窗距离衰减,y^32 0.5,也就是经历32个周期将衰减一半的权重,假设本周期值是V,本周期的加权累加值为Vx,则: 一个完整周期是T,给一个基础值1…

【技能树笔记】网络篇——练习题解析(十)

【技能树笔记】网络篇系列前九篇 【技能树笔记】网络篇——练习题解析(一)-CSDN博客 【技能树笔记】网络篇——练习题解析(二)-CSDN博客 【技能树笔记】网络篇——练习题解析(三)-CSDN博客 【技能树笔记】网…

大数据Flink(一百零五):SQL性能调优

文章目录 SQL性能调优 一、 ​​​​​​​MiniBatch 聚合

2023 年值得关注的国外网络安全初创公司

网络安全初创公司试图解决的问题往往有点超前于主流。他们可以比大多数老牌公司更快地填补空白或新兴需求。初创公司通常可以更快地创新,因为它们不受安装基础的限制。 当然,缺点是初创公司往往缺乏资源和成熟度。公司致力于初创公司的产品或平台是有风…

JavaWeb 怎么在servlet向页面输出Html元素?

service()方法里面的方法体&#xff1a; resp.setContentType("text/html;charsetutf-8");//获得输出流PrintWriter对象PrintWriter outresp.getWriter();out.println("<html>");out.println("<head><title>a servlet</title>…

SDL事件处理以及线程使用(2)

事件使用 #include <stdio.h> #include <SDL.h>#define FF_QUIT_EVENT (SDL_USEREVENT 1) // 定义自定义事件#undef main int main() {SDL_Window* pWindow NULL;SDL_Init(SDL_INIT_VIDEO);// 创建窗口pWindow SDL_CreateWindow("Event Test Title&…

DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯

动态规划理论 动态规划&#xff0c;Dynamic Programming&#xff0c; DP&#xff0c; 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导…

OpenTiny Vue 支持 Vue2.7 啦!

你好&#xff0c;我是 Kagol。 前言 上个月发布了一篇 Vue2 升级 Vue3 的文章。 &#x1f596;少年&#xff0c;该升级 Vue3 了&#xff01; 里面提到使用了 ElementUI 的 Vue2 项目&#xff0c;可以通过 TinyVue 和 gogocode 快速升级到 Vue3 项目。 有朋友评论替换butto…

校园物业报修小程序开发笔记一

背景 校园规模和复杂性&#xff1a; 大型学校和校园通常拥有众多的建筑物、设施和设备&#xff0c;需要有效的维护和报修系统&#xff0c;以满足学生、教职员工和校园管理人员的需求。 学生和员工需求&#xff1a; 学生和员工在校园内可能遇到各种维修问题&#xff0c;如故障的…

精品Python的大学教室资源预约管理系统

《[含文档PPT源码等]精品基于Python的大学教室资源管理系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前…

0028Java程序设计-智能农场监控报警系统设计与实现

文章目录 摘要目 录系统设计开发环境 摘要 我国是一个以农业为主的国家&#xff0c;在当今社会信息化迅速发展的背景下&#xff0c;将信息技术与农业相融合是必然的趋势。现代信息技术在农业生产中的运用&#xff0c;主要体现在两个领域&#xff1a;一是传感器技术&#xff1b…

基于SpringBoot和Vue的车辆违章信息查询系统

一、绪论 1.1 研究背景 当前社会交通事故频发&#xff0c;车辆违章现象屡见不鲜。为了解决这一问题&#xff0c;车辆违章信息查询系统应运而生。该系统能够自动检测车辆违章行为并提供相关信息&#xff0c;为交通管理提供了便利。 目前&#xff0c;基于 Java 语言的前后端完…

0030Java程序设计-积分管理系统论文

文章目录 摘  要**目  录**系统实现系统功能需求3.2.1 管理员功能3.2.2 柜员功能 开发环境 摘  要 随着计算机和网络的不断革新&#xff0c;世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然…

丰富你的场景验证用例

即使对于一个非常简单的IP&#xff0c;我们也无法验证充分&#xff0c;或者说无法证明芯片没有bug。一个验证人员所能够做的就是尽可能地发现更多的bug&#xff0c;增强流片成功的信心。 对于芯片的验证用例&#xff0c;在各个基本分支通路都已经覆盖了之后&#xff0c;还需要考…

Proteus仿真--单个数码管循环显示0-9(仿真文件+程序)

本文主要介绍基于51单片机的单个数码管循环显示0-9&#xff0c;Proteus仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真运行视频 Proteus仿真--单个数码管循环显示0-9&#xff08;仿真文件程序&#xff09; 附完整Proteus仿真资料代码资料 百度网盘链接: ht…

【波形图】在X轴上显示时间和日期

下面的VI截图展示了使用“获取日期/时间&#xff08;秒&#xff09;VI”的不同方法。 然后需要设置一下波形图的属性。 由“获取日期/时间&#xff08;秒&#xff09;&#xff08;Get Date/Time In Seconds&#xff09;”VI创建的时间标识表示自世界时间1904年1月1日星期五12:0…

走近Python爬虫(上):爬虫的作用和技术、获取网页内容、解析网页内容

文章目录 一、绪论爬虫的作用爬虫的技术 二、获取网页—requests模块1.requests模块简单使用2.使用多线程 三、解析网页1.XPath 参考 本文是Python爬虫系列博客的第一篇&#xff0c;内容概览如下&#xff1a; 一、绪论 爬虫的作用 收集数据&#xff1a; 爬虫可用于收集数据&…

roboflow标注检测 / 分割数据集

对比了labelme, makesense.ai和roboflow这3个可以标注数据集的工具之后&#xff0c; 总结一下它们的特点&#xff1a; labelme需要配环境安装&#xff0c;标注的结果是json文件&#xff0c;需要转成所需格式。 makesense.ai不需要下载&#xff0c;在线标注&#xff0c;能用来标…