spring注解原理剖析
注解(annotation)其实是一种接口,通过java的反射机制相关的API来访问annotation信息。Java语言解释器会在工作时忽略这些annotation,因此在JVM中这些annotation是不会被处理的,只能通过配套的工具才能对这些annotation类型的信息进行访问和处理。
annotation的类型使用关键字@interface。它继承了java.lang.annotation.Annotation接口,而不是申明了一个interface。
Annotation类型、方法定义是独特的、受限制的。Annotation类型的方法必须申明为无参数、无异常抛出的。方法后面可以使用default和一个默认数值来申明成员的默认值,null不能作为成员的默认值。
元注解@Target,@Retention,@Documented,@Inherited
@Target表示该注解用于什么地方,@Retention表示在什么级别保存改注解信息,@Documented表示将此注解包含在javadoc中,@Inherited表示允许子类继承父类中的注解。
注解示例:
1 @Target({ElementType.TYPE,ElementType.METHOD}) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface NeedLogin{ 4 boolean value() default true; 5 boolean guest() default true; 6 }
解析注解:
1 if(handler instanceof HandlerMethod){ 2 HandlerMethod method = (HandlerMethod)handler; 3 NeedLogin needLogin = method.getMethodAnnotation(NeedLogin.class); 4 if(needLogin == null){ 5 needLogin = method.getMethod().getDeclaringClass().getAnnotation(NeedLogin.class); 7 } 8 }
注解本身不做任何事情,只是像xml文件一样起到配置作用。注解代表的是某种业务意义,spring中@Resource注解简单解析:首先解析类的所有属性,判断属性上面是否存在这个注解,如果存在这个注解,再根据搜索规则来取得这个bean,然后通过反射注入。