Spring框架自2.0开始添加注解的支持,之后的每个版本都增加了更多的注解支持。注解为依赖注入,AOP(如事务)提供了更强大和简便的方式。这也导致你要是用一个相同的注解到许多不同的类中去。这篇文章介绍meta annotation来解决这个问题。

Meta Annotation(元注解)定义

Spring4.0的许多注解都可以用作meta annotation(元注解)。元注解是一种使用在别的注解上的注解。这意味着我们可以使用Spring的注解组合成一个我们自己的注解。

创建组合注解

自定义注解或组合注解是从其他的Spring元注解创建的。这种注解分为两类:

  • 1、只是为了编码简单将多个注解组合成一个注解;
  • 2、可以定义一个可复用的注解,这个注解可以解决问题,但是不用记住所有单独的注解。

如以下的DAO操作:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;  @Repository
@Scope("prototype")
@Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 30, isolation=Isolation.SERIALIZABLE)
public class OrderDaoImpl implements OrderDao {  ...
}  

没有任何的业务代码,但是类上注解的申明就让代码有10几行之多。为了简化DAO,我们提供一个组合DAO注解,使用Spring元注解来自定义一个注解。

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;  @Repository
@Scope("prototype")
@Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 30, isolation=Isolation.SERIALIZABLE)
public @interface MyDao {
}  

使用这个自定义/组合注解,我们可以移除掉DAO上的许多注解:

@MyDao
public class OrderDaoImpl implements OrderDao {  ...
}  

注解的属性

大部分情况下,注解是需要属性的。自定义的注解也可以提供属性。比如:@Repositoy可以提供一个name属性。

@Repository("myOrderDao")  

由于自定义的@MyDao可能被很多DAO使用,所以对@Repository的name硬编码是不行的。所以我们简单的添加一个value属性到@MyDao上(和@Repository中的相同的value属性)。

@Repository
@Scope("prototype")
@Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 30, isolation=Isolation.SERIALIZABLE)
public @interface MyDao {  String value();
}  

用新的自定义注解定义bean如下:

@MyDao("myOrderDao")
public class OrderDaoImpl implements OrderDao {  ...
}  

更多关于元数据注解的问题访问这里:Srping Framework Reference Documentation

Spring4.0之四:Meta Annotation(元注解)相关推荐

  1. 注解_自定义注解_元注解

    * 元注解:用于描述注解的注解 * @Target:描述注解能够作用的位置* ElementType取值:* TYPE:可以作用于类上* METHOD:可以作用于方法上* FIELD:可以作用于成员变 ...

  2. Annotation 最终奥义,元注解

    2019独角兽企业重金招聘Python工程师标准>>> 当你自定义出一个注解的时候,这个注解其实是没法使用的,因为你没有为注解指定的生存范围,生存的目标..因此为了限定自定义注解,就 ...

  3. [转]Struts2.3.16.1+Hibernate4.3.4+Spring4.0.2 框架整合

    原文地址:http://blog.csdn.net/ycb1689/article/details/22928519 最新版Struts2+Hibernate+Spring整合 目前为止三大框架最新版 ...

  4. JavaSE学习笔记之Annotation(注解)

    摘自:<疯狂Java讲义 第三版> Annotation简介 从JDK1.5开始,Java增加了对元数据(Metadata)的支持,也就是Annotation(注释),这种Annotati ...

  5. Android -- Annotation(注解)原理详解及常见框架应用

    1,我们在上一篇讲到了EventBus源码及3.0版本的简单使用,知道了我们3.0版本是使用注解方式标记事件响应方法的,这里我们就有一个疑问了,为什么在一个方法加上类似于"@Subscrib ...

  6. SpringMVC之Controller查找(Spring4.0.3/Spring5.0.4源码进化对比)

    0 摘要 本文从源码层面简单讲解SpringMVC的处理器映射环节,也就是查找Controller详细过程 1 SpringMVC请求流程 Controller查找在上图中对应的步骤1至2的过程 Sp ...

  7. java annotation list_Java 注解 (Annotation)你可以这样学

    注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 classs 和 interface 一样,注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念. 注解的 ...

  8. spring4.0之三:@RestController

    spring4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个 ...

  9. 玩转Java注解:元注解、内置注解、自定义注解的原理和实现

    点击关注公众号,实用技术文章及时了解 来源:www.jianshu.com/p/ddd0b880641a 前言 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种 ...

最新文章

  1. LeetCode 167. Two Sum II - Input array is sorted--Python解法
  2. 浅谈Mybatis的一级缓存和二级缓存
  3. 10.13 上午 考试
  4. 大龄程序员失业后,看他们是如何破局突围的? | 技术头条
  5. 使用struts2的 下载
  6. c语言调用android surface,Android GUI SurfaceFlinger
  7. 爬出数据标注陷阱,半监督学习模型暗藏多少玄机?
  8. 主流的分布式事务解决框架
  9. 小白学习vuex的超级全面版本
  10. 为什么都建议学java而不是python-为什么java比python复杂,还是有很多人选择学习java?...
  11. 笨方法学习python--46--python项目骨架
  12. 许可协议html,许可协议
  13. 调查 ESXi/ESX 上的虚拟机文件锁定 (10051)
  14. 交互体验之产品的文案
  15. 宏碁传奇Young和宏碁传奇Go14选哪个好参数对比评测
  16. macOS 10.15 支持的 xcode版本
  17. 第三章 区块链进阶 [18]
  18. 【时间序列分析】差分运算及延迟算子的性质
  19. RabbitMQ--扩展--11--均衡负载
  20. 合肥计算机专业大学排名23,计算机专业大学排名.doc

热门文章

  1. Java线程面试题 Top 53
  2. Html做文章查看上一篇下一篇功能,SDCMS文章添加上一篇、下一篇
  3. 操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)
  4. 《Python Cookbook 3rd》笔记(5.5):文件不存在才能写入
  5. 《Java8实战》笔记(02):通过行为参数传递代码
  6. linux嵌入式平台测试,protobuf-c 在arm linux 嵌入式平台的使用 测试
  7. Linux strtol将十六进制转化为十进制
  8. 完善博文 共享内存一写多读无锁实现的代码逻辑部分
  9. 解决 SSH Connection closed by foreign host 问题
  10. 安装ipfs-api的命令变了,最新版的命令如下