• Spring4.0之四:Meta Annotation(元注解)


    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

  • 相关阅读:
    dedecms织梦修改标题默认长度
    Python正课68 —— 实现面向对象编程
    Python正课67 —— 面向对象介绍
    Win10系统下提示VMware与Device/Credential Guard不兼容的解决方法
    周考5 月考1 内容
    Python正课66 —— ATM + 购物车 小有成就
    Python正课65 —— ATM + 购物车 架构
    Python正课64 —— re模块
    Python正课63 —— logging模块
    Python正课62 —— subprocess模块
  • 原文地址:https://www.cnblogs.com/duanxz/p/7491076.html
Copyright © 2020-2023  润新知