快捷搜索:  汽车  科技

spring常用注解及作用笔记(深入理解Spring中的各种注解)

spring常用注解及作用笔记(深入理解Spring中的各种注解)RetentionPolicy.RUNTIME保留至运行时,可以被反射读取。public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS /** * Annotations are to be recorded in the class file by the compiler and * retained by t

  • 1. Java中的注解
  • 2. 使用 元注解 来自定义注解 和 处理自定义注解
  • 3. spring的bean容器相关的注解
  • 4. spring中注解的处理
  • 5. Spring注解和JSR-330标准注解的区别:

Spring中的注解大概可以分为两大类:

  1. spring的bean容器相关的注解,或者说bean工厂相关的注解;
  2. springmvc相关的注解。

spring的bean容器相关的注解,先后有:@Required, @Autowired @PostConstruct @PreDestory,还有Spring3.0开始支持的JSR-330标准javax.inject.*中的注解(@Inject @Named @Qualifier @Provider @Scope @Singleton).

springmvc相关的注解有:@Controller @RequestMapping @RequestParam, @ResponseBody等等。

要理解Spring中的注解,先要理解Java中的注解。

1. Java中的注解

Java中1.5中开始引入注解,我们最熟悉的应该是:@Override 它的定义如下:

/** * Indicates that a method declaration is intended to override a * method declaration in a supertype. If a method is annotated with * this annotation type compilers are required to generate an error * message unless at least one of the following conditions hold: * The method does override or implement a method declared in a * supertype. * The method has a signature that is override-equivalent to that of * any public method declared in Object. * * @author Peter von der Ahé * @author Joshua Bloch * @jls 9.6.1.4 @Override * @since 1.5 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }

从注释,我们可以看出,@Override的作用是,提示编译器,使用了@Override注解的方法必须override父类或者java.lang.Object中的一个同名方法。我们看到@Override的定义中使用到了 @Target @Retention,它们就是所谓的“元注解”——就是定义注解的注解,或者说注解注解的注解(晕了...)。我们看下@Retention

/** * Indicates how long annotations with the annotated type are to * be retained. If no Retention annotation is present on * an annotation type declaration the retention policy defaults to * RetentionPolicy.CLASS. */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { /** * Returns the retention policy. * @return the retention policy */ RetentionPolicy value(); }

@Retention用于提示注解被保留多长时间,有三种取值:

public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time so they may be read reflectively. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }

RetentionPolicy.SOURCE 保留在源码级别,被编译器抛弃(@Override就是此类);RetentionPolicy.CLASS被编译器保留在编译后的类文件级别,但是被虚拟机丢弃;

RetentionPolicy.RUNTIME保留至运行时,可以被反射读取。

再看 @Target:

package java.lang.annotation; /** * Indicates the contexts in which an annotation type is applicable. The * declaration contexts and type contexts in which an annotation type may be * applicable are specified in JLS 9.6.4.1 and denoted in source code by enum * constants of java.lang.annotation.ElementType * @since 1.5 * @jls 9.6.4.1 @Target * @jls 9.7.4 Where Annotations May Appear */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { /** * Returns an array of the kinds of elements an annotation type * can be applied to. * @return an array of the kinds of elements an annotation type * can be applied to */ ElementType[] value(); }

@Target用于提示该注解使用的地方,取值有:

public enum ElementType { /** Class interface (including annotation type) or enum declaration */ TYPE /** Field declaration (includes enum constants) */ FIELD /** Method declaration */ METHOD /** Formal parameter declaration */ PARAMETER /** Constructor declaration */ CONSTRUCTOR /** Local variable declaration */ LOCAL_VARIABLE /** Annotation type declaration */ ANNOTATION_TYPE /** Package declaration */ PACKAGE /** * Type parameter declaration * @since 1.8 */ TYPE_PARAMETER /** * Use of a type * @since 1.8 */ TYPE_USE }

分别表示该注解可以被使用的地方:

  1. 类 接口,注解,enum;
  2. 属性域;
  3. 方法;
  4. 参数;
  5. 构造函数;
  6. 局部变量;
  7. 注解类型;

所以:

来源:https://dwz.cn/VssNCmnM


:-D 搜索微信号(ID:芋道源码),可以获得各种 Java 源码解析、原理讲解、面试题、学习指南。

:-D 并且,回复【书籍】后,可以领取笔者推荐的各种 Java 从入门到架构的 100 本书籍。

:-D 并且,回复【技术群】后,可以加入专门讨论 Java、后端、架构的技术群。

spring常用注解及作用笔记(深入理解Spring中的各种注解)(1)

来吧,骚年~

猜您喜欢: