spring

Spring注解原理探索(二)

2017-03-01  本文已影响311人  ibyr

之 Java中如何自定义注解

1.先看注解定义示例

@Override 源码定义:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

使用@interface 表示这是一个注解类。自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
标注 @Target 元注解,声明@Override 的作用地方为METHOD。
标注 @Retention 元注解,指明@Override 被保留的级别-源码级别,编译的时候就被忽略。

** 引申1:注解定义格式:public @interface 注解名 {定义体} **
** 引申2:定义注解时,不得继承其他的注解或者接口。 **

SpringMVC 的 @RequestMapping 源码示例:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)  // 注解一直保持到VM运行期,被反射读取。
@Documented
@Mapping    // SpringMVC定义的元注解,暂忽略此。
public @interface RequestMapping {
    String name() default "";
    
    @AliasFor("path")    // SpringMVC中定义的别名注解。
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

用法示例:
@RequestMapping(value="/user", methods=RequestMethod.GET),
@RequestMapping可供选择的参数有:
name, value, path, method, params, headers, consumes, produces。

  • 注解的每个参数对应着 @RequestMapping 类中的方法名。
  • 每个参数指定一个默认值(default)。

** 引申3:注解类体中,每一个方法实际上声明了一个注解参数。方法名就是参数名,返回值类型就是参数类型。 **

** 引申4:注解参数支持的类型:8种基本类型(byte,short,int,long,float,double,char,boolean),String类型,Class类型,enum类型,Annotation类型,以上所有类型的数组。 **

** 引申5:访问修饰权限:public或者默认default。 **

** 引申6:注解元素必须要有默认值。在定义注解的默认值中指定,或者在使用注解的时候指定。非基本类型不能默认null。 **

当自定义注解类之后,便可以在类(ElementType.TYPE)、方法(ElementType.METHOD)上标注 @RequestMapping。

那怎样做才能让注解被Java程序所运行?
请参考:Spring注解原理探索(三)之 Java如何识别注解

[未完]

上一篇下一篇

猜你喜欢

热点阅读