用Spring组成自定义注释
Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法。 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释。
在本文中,我们将介绍一个非常有用的Spring功能,该功能允许我们基于一个或多个Spring注释创建自己的注释。
编写自定义注释
假设我们有一组经常一起使用的Spring注释。 一个常见的示例是@Service和@Transactional的组合:
@Service @Transactional (rollbackFor = Exception. class , timeout = 5 ) public class UserService { ... }
不必一遍又一遍地重复两个注释,我们可以创建包含这两个Spring注释的自己的注释。 创建我们自己的注释非常简单,如下所示:
@Service @Transactional (rollbackFor = Exception. class , timeout = 5 ) @Retention (RetentionPolicy.RUNTIME) public @interface MyService {}
注释是使用@interface关键字定义的(而不是类或接口)。 标准Java注释@Retention用于指示注释应在运行时可处理。 我们还将两个Spring注释都添加到了注释中。
现在,我们可以使用自己的@MyService批注来批注我们的服务:
@MyService public class UserService { ... }
Spring现在检测到@MyService被@Service和@Transactional注释,并提供与前面的示例相同的行为,并且在UserService类中存在两个注释。
请注意,这是Spring注释处理方式的功能,而不是一般的Java功能。 如果将其他框架和库的注释添加到自己的注释中,则它们可能无法正常工作。
用例范例
自定义注释可以在各种情况下使用,以提高代码的可读性。 这是另外两个可能派上用场的例子。
也许我们在代码的各个位置都需要一个属性值。 通常使用Spring的@Value注释注入属性:
// injects configuration properties my.api.key @Value ( "${my.api.key}" ) private String apiKey;
在这种情况下,我们可以将属性表达式从代码中移到单独的注释中:
@Value ( "${my.api.key}" ) @Retention (RetentionPolicy.RUNTIME) public @interface ApiKey {}
现在,在我们的代码中,我们可以使用@ApiKey而不是在各处重复属性表达式:
@ApiKey private String apiKey;
另一个例子是集成测试。 在测试中,通常使用各种Spring批注来定义测试设置。 可以使用自定义注释将这些注释分组在一起。 例如,我们可以创建一个@MockMvcTest注释,该注释定义模拟mvc测试的Spring设置:
@SpringBootTest @AutoConfigureMockMvc (secure = false ) @TestPropertySource (locations = "classpath:test.properties" ) @ExtendWith (SpringExtension. class ) @Retention (RetentionPolicy.RUNTIME) public @interface MockMvcTest {}
现在,我们的测试定义看起来更加清晰。 我们只需要添加@MockMvcTest即可获得完整的测试设置:
@MockMvcTest public class MyTest { ... }
请注意,我们的@MockMvcTest批注还包含JUnit 5的@ExtendWith批注。与Spring一样,如果将其添加到您自己的自定义批注中,JUnit 5也能够检测到此批注。 请注意,如果仍在使用JUnit 4,这将无法正常工作。对于JUnit 4,您必须使用@RunWith而不是@ExtendWith。 不幸的是,@RunWith仅在直接放在测试类中时才起作用。
春天的例子
Spring在各种情况下都使用此功能来定义常用注释的快捷方式。
这里有一些例子:
- @GetMapping是@RequestMapping的简短版本(方法= {RequestMethod.GET})。
- @RestController是@Controller和@ResponseBody的组合。
- @SpringBootApplication是@ SpringBootConfiguration,@ EnableAutoConfiguration和@ComponentScan的快捷方式
您可以通过查看Spring源代码中这些注释的定义来自己验证。
翻译自: https://www.javacodegeeks.com/2020/02/composing-custom-annotations-with-spring.html
用Spring组成自定义注释相关推荐
- spring使用自定义注解_用Spring组成自定义注释
spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...
- 通过SPANN方式将Spring&Quartz与自定义注释集成
在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...
- Spring MVC自定义验证注释
在上一教程中,我展示了如何使用注释来验证表单 . 这对于简单的验证非常有用,但是最终,您需要验证一些现成的注释中没有的自定义规则. 例如,如果您需要根据输入的出生日期来验证用户已超过21岁,或者可能需 ...
- 使用SPANN方式将Spring&Quartz与自定义注释集成
在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...
- spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构
spring aop 注释 下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您具有反射 ...
- 使用Spring AOP,自定义注释和反射为您的应用审核基础架构
下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您对反射和AOP具有一般知识). 我们 ...
- java 自定义注释_带有自定义注释的Java注释教程
java 自定义注释 Java批注提供有关代码的信息,并且它们对其批注的代码没有直接影响. 在本教程中,我们将学习Java注释,如何编写自定义注释 ,注释用法以及如何使用反射来解析注释 . 注释是在J ...
- 带有自定义注释的Java注释教程
Java注释提供有关代码的信息,并且它们对所注释的代码没有直接影响. 在本教程中,我们将学习Java注释,如何编写自定义注释 ,注释用法以及如何使用反射来解析注释 . 注释是在Java 1.5中引入的 ...
- 3.Spring Security 自定义用户认证
Spring Security自定义用户认证 自定义认证过程 自定义认证的过程需要实现Spring Security提供的UserDetailService接口,该接口只有一个抽象方法loadUser ...
最新文章
- LeetCode Palindrome Linked List
- md3600i存储服务器连接 iscsi+multipath配置
- 删除字符串的前置或者后置空格
- edge浏览器运行不流畅怎么办 提高edge浏览器速度的方法
- 虚拟专题:知识图谱 | 医学知识图谱构建关键技术及研究进展
- 自定义带标尺的seekbar
- Java面试之synchronized和Lock有什么区别?
- [转]30个自我提升技巧
- SQL Server中的sysobjects” 是什么意思
- 老男孩python作业_老男孩python学习之作业一购物小程序
- 【小福利】包邮送40本畅销书籍
- (java)word转html并提取word中的目录结构树生成到html页面中的左边树
- Linux电源管理(7)_Wakeup events framework
- 笔记本电脑怎么给别人开热点
- win10更新不动怎么办,win10更新卡住解决办法
- 华为nova5ipro的优缺点_华为nova5pro的优缺点有哪些?
- termux python3-dev_termux进阶
- powerDesigner 从postgresql数据库中绘制ER图
- 140版本 boost_怎么分辨阿迪UB3.0和UB4.0,boost各版本有什么区别?
- vue 绑定多个class 顺便带上三元运算 判断