Spring4.0系列4-Meta Annotation(元注解)

简介:

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

Meta Annotation(元注解)定义

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

创建组合注解

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

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

如以下的DAO操作:

Java代码   收藏代码
  1. import org.springframework.context.annotation.Scope;  
  2. import org.springframework.stereotype.Repository;  
  3. import org.springframework.transaction.annotation.Isolation;  
  4. import org.springframework.transaction.annotation.Propagation;  
  5. import org.springframework.transaction.annotation.Transactional;  
  6.    
  7. @Repository  
  8. @Scope("prototype")  
  9. @Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 30, isolation=Isolation.SERIALIZABLE)  
  10. public class OrderDaoImpl implements OrderDao {  
  11.   ...  
  12. }  

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

Java代码   收藏代码
  1. import org.springframework.context.annotation.Scope;  
  2. import org.springframework.stereotype.Repository;  
  3. import org.springframework.transaction.annotation.Isolation;  
  4. import org.springframework.transaction.annotation.Propagation;  
  5. import org.springframework.transaction.annotation.Transactional;  
  6.    
  7. @Repository  
  8. @Scope("prototype")  
  9. @Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 30, isolation=Isolation.SERIALIZABLE)  
  10. public @interface MyDao {  
  11. }  

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

Java代码   收藏代码
  1. @MyDao  
  2. public class OrderDaoImpl implements OrderDao {  
  3.   ...  
  4. }  

 

注解的属性

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

Java代码   收藏代码
  1. @Repository("myOrderDao")  

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

Java代码   收藏代码
  1. @Repository  
  2. @Scope("prototype")  
  3. @Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 30, isolation=Isolation.SERIALIZABLE)  
  4. public @interface MyDao {  
  5.     String value();  
  6. }  

 

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

Java代码   收藏代码
  1. @MyDao("myOrderDao")  
  2. public class OrderDaoImpl implements OrderDao {  
  3.   ...  
  4. }  

 

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

目录
相关文章
|
Java Spring
Spring的meta标签
Spring的解析源码 public void parseMetaElements(Element ele, BeanMetadataAttributeAccessor attributeAccessor) { //获取当前节点的所有子元素     NodeList nl = ele.
1792 0
|
22天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
38 0
|
2月前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
48 0
|
30天前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
106 0
|
3月前
|
Java Spring
springboot跨域配置
springboot跨域配置
31 0
|
1月前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
10天前
|
前端开发 Java 应用服务中间件
Springboot对MVC、tomcat扩展配置
Springboot对MVC、tomcat扩展配置
|
1天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
4 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
3天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
28 0
【Spring系列】Sping VS Sping Boot区别与联系
|
10天前
|
Java 容器 Spring
Springboot自动配置原理
Springboot自动配置原理