有關Annotation的繼承說明:
1、JDK文檔中的說明是:只有在類上應用的Annotation才能被繼承,而實際應用時的結果是:除了類上應用的Annotation能被繼承外,沒有被重寫的方法的Annotation也能被繼承。
2、要注意的是:當方法被重寫后,Annotation將不會被繼承。
3、要使得Annotation 被繼承,需要在Annotation中加標識@Inherited,並且如果要被反射應用的話,就需要還有個@Retention(RetentionPolicy.RUNTIME) 標識。
4、Annotation的繼承不能應用在接口上。
特別說明下spring事務注解@Transactional:
@Transactional 注解應該只被應用到 public 可見度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不會報錯, 但是這個被注解的方法將不會展示已配置的事務設置。
@Transactional 注解可以被應用於接口定義和接口方法、類定義和類的 public 方法上。然而,請注意僅僅 @Transactional 注解的出現不足於開啟事務行為,它僅僅 是一種元數據,能夠被可以識別 @Transactional 注解和上述的配置適當的具有事務行為的beans所使用。上面的例子中,其實正是 <tx:annotation-driven/>元素的出現 開啟 了事務行為。
Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實現的任何接口上。你當然可以在接口上使用 @Transactional 注解,但是這將只能當你設置了基於接口的代理時它才生效。因為注解是 不能繼承 的,這就意味着如果你正在使用基於類的代理時,那么事務的設置將不能被基於類的代理所識別,而且對象也將不會被事務代理所包裝(將被確認為嚴重的)。因此,請接受Spring團隊的建議並且在具體的類上使用 @Transactional 注解。
注意
當使用 @Transactional 風格的進行聲明式事務定義時,你可以通過 <tx:annotation-driven/> 元素的 "proxy-target-class" 屬性值來控制是基於接口的還是基於類的代理被創建。如果 "proxy-target-class" 屬值被設置為 "true",那么基於類的代理將起作用(這時需要CGLIB庫cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 屬值被設置為 "false" 或者這個屬性被省略,那么標准的JDK基於接口的代理將起作用。