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上的許多注解:
注解的屬性
大部分情況下,注解是需要屬性的。自定義的注解也可以提供屬性。比如:@Repositoy可以提供一個name屬性。
@Repository("myOrderDao")
?由于自定義的@MyDao可能被很多DAO使用,所以對@Repository的name硬編碼是不行的。所以我們簡單的添加一個value屬性到@MyDao上(和@Repository中的相同的value屬性)。
用新的自定義注解定義bean如下:
?更多關于元數據注解的問題訪問這里:Srping Framework Reference Documentation