@RequestMapping("/addActivity.ajax") @ResponseBody publi void addActivity(Activity activity){ }
這是spring mvc Controller 中的註解 意思是下面的方法(addActivity)處理addActivity.ajax的請求,不止是spring mvc,在整個spring 體系中,包括其餘框架中都有大量用到註解,那咱們如今來了解下註解的知識.java
註解的創建ajax
快捷鍵 Ctrl+N 選擇Annoationspring
元註解mvc
1.@Target
2.@Retention,
3.@Documented,
4.@Inheritedapp
這是Java的四個元註解,能夠用來修飾咱們本身定義的註解,也能夠理解成註解的註解,框架
@Target,@Retention比較常見函數
@Retentionspa
這個註解代表會被保留到哪一個階段. 有三個值:
RetentionPolicy.SOURCE —— 這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略
RetentionPolicy.CLASS —— 這種類型的Annotations編譯時被保留,在class文件中存在,但JVM將會忽略
RetentionPolicy.RUNTIME —— 這種類型的Annotations將被JVM保留,因此他們能在運行時被JVM或其餘 使用反射機制的代碼所讀取和使用..net
通常咱們用到自定義註解的時候都會用到反射,因此建立字自定義註解時通常設置成RUNTIME級別code
若是沒設置@Retention 則默認爲 RetentionPolicy.CLASS。
@Target
用於描述註解的使用範圍(能夠做用於java的那個部分,好比修飾變量的註解是不能修飾方法的,註解能夠修飾什麼地方就是由@Target決定的)
1.CONSTRUCTOR:用於描述構造器
2.FIELD:用於描述域
3.LOCAL_VARIABLE:用於描述局部變量
4.METHOD:用於描述方法
5.PACKAGE:用於描述包
6.PARAMETER:用於描述參數
7.TYPE:用於描述類、接口(包括註解類型) 或enum聲明
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface TargetField { public String desc() default "這個註解修飾做用類裏面的域變量"; }
public class Targetdesc { @TargetField(desc="實例變量") private String classparam; @TargetField(desc="靜態變量也能夠") private static int age; @TargetConstructor(desc="構造函數") public Targetdesc() { // TODO Auto-generated constructor stub } public static void fun1(@TargetParameter(desc="方法參數一") String param){ @TargetLocal_variable(desc="方法內部變量") String local_variable = ""; } @TargetMethod(desc="方法") public void fun2(){ /*@TargetField(desc="靜態變量也能夠") TargetField 不能修飾方法內部變量*/ String local_variable = ""; } }
註解也能夠修飾多個地方
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD})
註解處理器
回到最前面的例子,後臺接收到addActivity.ajax請求後會調用addActivity方法,那咱們是否是首先得取到
@RequestMapping(spring mvc實現的自定義註解)註解的值,這樣才能跟請求的入參匹配.
那麼咱們來獲取註解裏面的值。
個人作法是這樣的,
1 首先經過獲取所要獲取的註解做用的Java裏面的結構(好吧我不太知道怎樣去描述 就是說咱們要獲取的 註解只做用於方法 那就首先獲取類的方法,要是做用於域那就獲取類的域)。
2 在第一步的基礎上獲取註解
咱們用代碼來描述下吧
public static void main(String[] args) { // TODO Auto-generated method stub for(Field f:Targetdesc.class.getDeclaredFields()){//獲取做用變量上的註解 //TargetField是做用在變量上的註解名 註解也是類 TargetField TargetField = f.getAnnotation(TargetField.class); if (TargetField != null) { System.out.println(TargetField.desc()); } } for(Method m:Targetdesc.class.getDeclaredMethods()){ TargetMethod fargetMethod =m.getAnnotation(TargetMethod.class); if (fargetMethod != null) { System.out.println(fargetMethod.desc()); } } }
打印出來的結果就是上述代碼中註解的desc值
類變量 靜態變量也能夠 方法