為什么學習注解?
學習注解有什么好處?
學完能做什么?
答:1. 能夠讀懂別人寫的代碼,特別是框架相關的代碼;
2. 讓編程更加簡潔,代碼更加清晰;
3. 讓別人高看一眼。
spring、mybatis使用了大量的注解,會用注解不是目的,會使用自定義注解才是亮點。
java注解在java1.5版本引入。
一、概念
Java提供了一種原程序中的元素關聯任何信息和任何元數據的途徑和方法。
二、Java中的常見注解
1、JDK自帶注解
@Override 表示覆蓋或重寫父類的方法;
@Deprecated 表示該方法已經過時了。(當方法或是類上面有@Deprecated注解時,說明該方法或是類都已經過期不能再用,但不影響以前項目使用,提醒你新替代待的方法或是類。如果程序員不小心使用了它的元素,那么編譯器會發出警告信息。)
@SuppressWarnings 表示忽略指定警告,比如@Suppvisewarnings("Deprecation")
比如下面的例子:
person接口:
1 public interface Person { 2 public String name(); 3 4 public int age(); 5 6 /*@Deprecated 表示該方法已經過時了*/ 7 @Deprecated 8 public void sing(); 9 /*注: 10 當方法或是類上面有@Deprecated注解時, 11 說明該方法或是類都已經過期不能再用, 12 但不影響以前項目使用,提醒你新替代待的方法或是類 13 */ 14 }
child實現類:
1 public class Child implements Person { 2 3 /*@Override 表示覆蓋或重寫父類的方法*/ 4 @Override 5 public String name() { 6 // TODO Auto-generated method stub 7 return null; 8 } 9 10 11 @Override 12 public int age() { 13 // TODO Auto-generated method stub 14 return 0; 15 } 16 17 18 @Override 19 public void sing() { 20 // TODO Auto-generated method stub 21 22 }
測試類:
1 public class Test { 2 /*@SuppressWarnings 表示忽略指定警告,比如@Suppvisewarnings("Deprecation")*/ 3 @SuppressWarnings("deprecation") 4 public void sing(){ 5 Person p=new Child(); 6 7 p.sing(); 8 } 9 10 }
2、第三方注解
具體示例如下:
Autowired將成員變量自動注入進來
三、注解的分類
按運行機制(注解存在於程序的那個階段)將注解分為三類:源碼注解(只在源碼存在)、編譯注解(在class文件中也存在)、運行時注解(在運行階段仍然起作用)
按照來源來分的話,有如下三類:
1:JDK自帶的注解(Java目前只內置了三種標准注解:@Override、@Deprecated、@SuppressWarnings,以及四種元注解:@Target、@Retention、@Documented、@Inherited)
2:第三方的注解——這一類注解是我們接觸最多和作用最大的一類
3:自定義注解——也可以看作是我們編寫的注解,其他的都是他人編寫注解
按照功能來分的,還有,元注解——注解的注解。
四、自定義注解
1、自定義注解的語法要求
2、元注解
現在逐行分析:
@Target 是注解的作用域 :表示該注解可以用於一個類中的那些屬性及方法上,如果作用域類型有多個用英文逗號分隔
下面是注解的作用域的列表:
@Retention:表示該注解的生命周期
注解按聲明周期有個分類:
@Inherited:此注解是標識性的元注解,表示當前注解可以由子注解來繼承
@Documented:表示生成javadoc的時候會包含注解
3、使用自定義注解
示例:
注解的定義看起來很像接口的定義,事實上,與其他任何Java接口一樣,注解也將會編譯成class文件。
定義注解時,會需要一些元注解(meta-annotation),如@Target和@Retention。@Target用來定義你的注解將用於什么地方(例如是一個方法或一個域)。@Retention用來定義該注解在哪一個級別可用,在源代碼(SOURCE)、類文件中(CLASS)或者運行時(RUNTIME)。
4、解析注解
概念:通過反射獲取類、函數或成員上運行時注解信息,從而實現動態控制程序運行的邏輯。
如:
使用forName()方法加載類,並使用getAnnotation(Description.class)檢查該類是否帶有@Description注解。
注解的繼承只能作用在類上,方法上的注解不會被繼承,Interface中的所有注解不會被繼承。
五、注解的項目實戰
具體示例:
Test測試類:
首先,考慮代碼如何與數據庫進行映射。
上面的Filter類與數據庫表的結構非常相似。
對注解@Table 和@Column進行定義:
接下來考慮query()方法的實現:
運行結果:
此時需要對4.3部分改善一下:
運行結果:
改善后:
此時運行結果:
以上就基本完成了需求。
六、注解總結
看我們都學會了啥?