@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值
类变量 静态变量也能够 方法