注解的工作机制
举个例子:@Service
注解- 声明引用该注解的Java类为 Service
对象
如下可以看出,注解其实也是一个类,而且类里可以继续引用其他的注解类,所以一个 Annotation
是由多个 Annotation
组合而成的。
1. Target
java.lang.annotation.Target
也是一个注解,只有一个数组属性,作用是设定注解的作用范围,比如作用于方法或者类等,可以同时设定多个范围。
具体可以作用的类型配置在 java.lang.annotation.ElementType
枚举类中,常用如下:
ElementType.TYPE
- 可以作用于类 、 接口类、 枚举类上 ```java @Service public class MessageServiceImpl implements MessageService{public String getMessage() {
return "Hello World!";
}
}
2. `ElementType.FIELD` - 可以作用于类的属性上
```java
public class MessageServiceImpl implements MessageService{
@Autowired
private WorkspaceService workspaceService;
}
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
枚举类中,有三个值可以选择:
SOURCE
- 纯注释作用CLASS
- 编译阶段有效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 {
}