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组成自定义注释相关推荐

  1. spring使用自定义注解_用Spring组成自定义注释

    spring使用自定义注解 Java批注在2004年随Java 5一起引入,是一种将元数据添加到Java源代码中的方法. 如今,许多主要框架(如Spring或Hibernate)都严重依赖注释. 在本 ...

  2. 通过SPANN方式将Spring&Quartz与自定义注释集成

    在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...

  3. Spring MVC自定义验证注释

    在上一教程中,我展示了如何使用注释来验证表单 . 这对于简单的验证非常有用,但是最终,您需要验证一些现成的注释中没有的自定义规则. 例如,如果您需要根据输入的出生日期来验证用户已超过21岁,或者可能需 ...

  4. 使用SPANN方式将Spring&Quartz与自定义注释集成

    在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...

  5. spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构

    spring aop 注释 下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您具有反射 ...

  6. 使用Spring AOP,自定义注释和反射为您的应用审核基础架构

    下一篇文章将演示如何使用Spring AOP和注释编写简单的审计. 审核机制将是干净,高效且易于维护的(和Kewwl!). 我将在用户管理系统上演示我的示例(假设您对反射和AOP具有一般知识). 我们 ...

  7. java 自定义注释_带有自定义注释的Java注释教程

    java 自定义注释 Java批注提供有关代码的信息,并且它们对其批注的代码没有直接影响. 在本教程中,我们将学习Java注释,如何编写自定义注释 ,注释用法以及如何使用反射来解析注释 . 注释是在J ...

  8. 带有自定义注释的Java注释教程

    Java注释提供有关代码的信息,并且它们对所注释的代码没有直接影响. 在本教程中,我们将学习Java注释,如何编写自定义注释 ,注释用法以及如何使用反射来解析注释 . 注释是在Java 1.5中引入的 ...

  9. 3.Spring Security 自定义用户认证

    Spring Security自定义用户认证 自定义认证过程 自定义认证的过程需要实现Spring Security提供的UserDetailService接口,该接口只有一个抽象方法loadUser ...

最新文章

  1. LeetCode Palindrome Linked List
  2. md3600i存储服务器连接 iscsi+multipath配置
  3. 删除字符串的前置或者后置空格
  4. edge浏览器运行不流畅怎么办 提高edge浏览器速度的方法
  5. 虚拟专题:知识图谱 | 医学知识图谱构建关键技术及研究进展
  6. 自定义带标尺的seekbar
  7. Java面试之synchronized和Lock有什么区别?
  8. [转]30个自我提升技巧
  9. SQL Server中的sysobjects” 是什么意思
  10. 老男孩python作业_老男孩python学习之作业一购物小程序
  11. 【小福利】包邮送40本畅销书籍
  12. (java)word转html并提取word中的目录结构树生成到html页面中的左边树
  13. Linux电源管理(7)_Wakeup events framework
  14. 笔记本电脑怎么给别人开热点
  15. win10更新不动怎么办,win10更新卡住解决办法
  16. 华为nova5ipro的优缺点_华为nova5pro的优缺点有哪些?
  17. termux python3-dev_termux进阶
  18. powerDesigner 从postgresql数据库中绘制ER图
  19. 140版本 boost_怎么分辨阿迪UB3.0和UB4.0,boost各版本有什么区别?
  20. vue 绑定多个class 顺便带上三元运算 判断

热门文章

  1. CF7D-Palindrome Degree【字符串hash,dp】
  2. ssl1377-竞赛真理【dp之分组背包】
  3. 【图论】【斜率优化】前往大都会(loj 2769)
  4. 有上下界网络流问题汇总
  5. 反向传播算法学习笔记
  6. UVALive 8518 - Sum of xor sum
  7. 28、jdbc操作数据库(5)
  8. Java 并发总结——进程与线程
  9. SpringCloud Ribbon(二)之自定义负载均衡策略IRule
  10. 面试时如何介绍自己的项目经验