Java注解 - 图1

注解的工作机制

举个例子:
@Service 注解- 声明引用该注解的Java类为 Service 对象
如下可以看出,注解其实也是一个类,而且类里可以继续引用其他的注解类,所以一个 Annotation 是由多个 Annotation 组合而成的。
Java注解 - 图2

1. Target

java.lang.annotation.Target 也是一个注解,只有一个数组属性,作用是设定注解的作用范围,比如作用于方法或者类等,可以同时设定多个范围。
具体可以作用的类型配置在 java.lang.annotation.ElementType 枚举类中,常用如下:

  1. ElementType.TYPE - 可以作用于类 、 接口类、 枚举类上 ```java @Service public class MessageServiceImpl implements MessageService{

    public String getMessage() {

    1. return "Hello World!";

    }

}


2. `ElementType.FIELD`  - 可以作用于类的属性上
```java
public class MessageServiceImpl implements MessageService{

    @Autowired
    private WorkspaceService workspaceService;

}
  1. ElementType.METHOD - 可以作用于类的方法上 ```java

public class MessageServiceImpl implements MessageService{

@ResponseBody
public String getMessage() {
     return "Hello World!";
}

}


4. `ElementTyep.PARAMETER`  - 可以作用于类的参数
```java
public class MessageServiceImpl implements MessageService{

    public String getMessage(@RequestParam("msg")String msg) {
         return "Hello "+msg;
    }

}

如果想同时作用于类和方法上就可以:

@Target({ElementType.TYPE,ElementType.METHOD})

2. Retention

java.lang.annotation.Retention 自身也是一个注解, 用于声明注解的生命周期 ,就是在Java编译、运行的哪个阶段有效,它的值定义在 java.lang.annotation.RetentionPolicy.RUNTIME 枚举类中,有三个值可以选择:

  1. SOURCE - 纯注释作用
  2. CLASS - 编译阶段有效
  3. RUNTIME - 运行阶段有效

如果是自定义的 Annotation ,一般都会设置成 RUNTIME

3. Documented

java.lang.annotation.Documented 自身也是一个注解, 作用是将注解中的元素包含到 Java Doc文档中 ,一般情况下,都会添加这个注解的。

4. @interface

作用是声明当前的Java类型是 Annotation ,固定语法

5. Annotation 属性

String value() default "";

Annotation 的属性约定了属性的类型(String、boolean、 int 、long)和属性名称(默认名称是 value ), default 是默认值。属性是可以有多个的。
@Service 也可以写成

import org.springframework.stereotype.Service;

@Service(value="Demo")
public class Demo {

}

import org.springframework.stereotype.Service;

@Service("Demo")
public class Demo {

}