一、什么是注解?
注解的英文是annotation,就是使用@
符号来标注类、方法、类成员、局部变量、方法参数等。用于表示一些特殊的含义。比如我们常见的@Controller
, @Service
, @Repository
, @Autowired
等。
二、为什么要有注解? 注解有什么作用?
我理解这跟编程思想中的DRY(don't repeat yourself)的原则是吻合的。用统一的一个标识符@
来标识一组具有相同属性的对象。
在Spring中,框架会自动扫描被标注的类,并把使用@Componet
标注的类以bean的形式注入到框架中。方便供框架管理这些类的创建与销毁。
我们常用的JUnit,也会自动扫描被@Test
标注的方法,认为它们是单独供JUnit框架管理的单测方法。
所以,使用注解,就是为了方便我们为类、方法、属性、参数等对象打一个标签,做一个标识。开发框架或架构师可以根据这些标识做自己的逻辑处理。
三、如何实现自定义注解?
3.1 通过元注解来实现注解
拿我们经常用到的@Autowired
来举例,
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
解释:
通过 @interface 来声明一个注解。
@Target 说明注解所修饰的对象范围,取值的话,有
- CONSTRUCTOR: 构造器
- FIELD: 域
- LOCAL_VARIABLE: 局部变量
- METHOD: 方法
- PACKAGE: 包
- PARAMETER: 参数
- TYPE: 类、接口、enum声明
@Retention描述注解的生命周期,在什么时候生效,有3个
- SOURCE
- CLASS
- RUNTIME
@Documented说明可被javadoc此类工具文档化
@Inherited说明被标注的类型是被继承的(// TODO 举例说明)
3.2 如何获取注解名与值
通过反射。关于什么是反射,会单独写一个笔记来记录。在这里,我们先有一个概念,就是可以通过某一种方法来获取注解的名称,以及其中的值。
// todo 举例
@Hello
public class Any {
}
属性上的
@Hello
private String name;