注解 VS xml
XML 以松耦合的方式完成了框架中几乎所有的配置。但是随着项目越来越大, XML内容也越来越复杂,维护成本越来越高
注解是一种高耦合的配置方式,可以在几乎所有的需要配置地方使用注解
什么时候使用XML
项目内部达成一致约定的配置
注解无法实现,或者无法轻易实现的情况
注解分类
JAVA内置注解
@Override,@Deprecated,@SuppressWarnings(),在编译期起作用。
自定义注解
程序员自己定义的注解
元注解
用来定义注解的注解
自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
public int id() default 1;
public String msg() default "hello";
}
其中使用@interface声明自定义注解。字段描述和Java的接口声明类似。
@Target
表示注解作用的地方
ElementType.ANNOTATION_TYPE 给注解进行注解
ElementType.CONSTRUCTOR 给构造方法进行注解
ElementType.FIELD给属性进行注解
ElementType.LOCAL_VARIABLE 给局部变量进行注解
ElementType.METHOD 给方法进行注解
ElementType.PACKAGE 给包进行注解
ElementType.PARAMETER 给方法内参数进行注解
ElementType.TYPE 给一个类型进行注解,比如类、接口、枚举
@Retention
代表这个注解的存活时间
RetentionPolicy.SOURCE
存在源码阶段,编译器进行编译时它将被丢弃忽视
RetentionPolicy.CLASS
中保留都编译进行时,它不会被加载到 JVM 中
RetentionPolicy.RUNTIME
注解可以保留到程序运行时候,它会加载到JVM中,所以程序运行时可以获取他们。
注解提取
注解通过反射获取
Class demoClass = Class.forName("com.aliware.mamba.annotation.Demo");
boolean hasAnnotation = demoClass.isAnnotationPresent(TestAnnotation.class);
if(hasAnnotation) {
DankunAnnotation dankunAnnotation = (DankunAnnotation) demoClass.getAnnotation(TestAnnotation.class);
System.out.println(dankunAnnotation.id());
System.out.println(dankunAnnotation.msg());
}
总结
注解相当于只是打了一个标签,如果没有解析它的代码,它可能连注释都不如。
解析一个类或者方法的注解往往有两种形式:
编译期间直接扫描
运行期间反射