注解
注解是形如@Resource
,可以加在类、方法、属性、参数等上面,以实现特定功能的一种java组件。
在写java代码的时候,我比较常见到的是Spring注解。比如在类上使用@Component
,将这个类注册到Spring,成为Spring的Bean;在属性上使用@Autowired
注解,将Bean注入到这个类。而在没有注解之前,Bean的注册和注入是通过配置文件完成的。
自定义注解
除了使用各种框架提供的现成的注解,我们也可以自己定义注解,以实现定制化的需求。以下为自定义注解步骤:
-
新建一个注解类,修饰符使用
@interface
。package annotation; public @interface Unit { }
-
定义配置参数。与类的属性定义的区别是:注解的配置参数名后面要跟一个
()
。此外,可以为配置参数设置默认值。package annotation; public @interface Unit { String value() default "cm"; }
-
为注解添加
@Target
注解(可以使用在注解类上的注解,叫做元注解),限制该注解可以作用在类、方法、属性上面,还是都可以。package annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(ElementType.METHOD) public @interface Unit { String value() default "cm"; }
-
为注解添加
@Retention
注解,用来定义注解的生命周期。这里我们通常定义为RetentionPolicy.RUNTIME
,即该注解在运行期起作用(此外,还有RetentionPolicy.SOURCE
,标识该注解在编译期起作用;RetentionPolicy.CLASS
,标识该注解在class文件中起作用)package annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Unit { String value() default "cm"; }
以上,我们就完成了一个自定义的注解。
使用自定义注解
可以像使用其他注解一样使用自定义注解,示例如下:
package obj.desk;
import annotation.Unit;
/**
* 升降桌
*/
public class LiftDesk extends Desk {
/**
* 升起桌子(通过注解定义参数distance的单位:米)
*/
@Unit(value = "m")
public void up(double distance) {
}
/**
* 降下桌子(通过注解定义参数distance的单位,使用默认值:厘米)
*/
@Unit
public void down(double distance) {
}
}
让自定义注解发挥作用
像我们上面定义的注解Unit
,用来声明distance
的单位。实际上它发挥的作用是储存数据,即属性value的值。而我们可以使用比如反射,拿到这个值,然后使用这个值做一些事。
在实际工作中,我见过在aop中取注解中的属性值,见过在拦截器中取注解的值,然后做一些通用的事,这些场景下,自定义注解就非常有用。
结语
以上,我们就完成了自定义注解从定义、使用到发挥作用的整个过程。