注解是形如@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中取注解中的属性值,见过在拦截器中取注解的值,然后做一些通用的事,这些场景下,自定义注解就非常有用。
以上,我们就完成了自定义注解从定义、使用到发挥作用的整个过程。