接触过Spring开发的或多或少都使用过其注解,写业务代码的同学使用的较频繁的莫过于: @Controller、@Service、@Repository。这些注解相比于@Transactional、@Cacheable等可以接收较为丰富的元数据,它们扮演的角色更倾向于标记被注解的类在整体架构下的角色,如@Service表征着这个类在架构中是一个服务。查阅它们的源代码,动手尝试自定义一个注解吧
- 自定义一个注解
package com.qutopia.bixi.spring.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * custom anotation * * @author choaklin * @since 0.1.0 */ @Documented // ①声明可以使用该注解的目标类型 @Target(ElementType.TYPE) // ②声明注解的保留期限 @Retention(RetentionPolicy.RUNTIME) public @interface Action { // ③声明注解成员 String value() default ""; }
-
注解的解释器
在JDK5.0里,Package、Class、Constructor、Method以及Field等反射对象都新增了访问注解信息的方法:<T extends Annotation>T getAnnotation(Class<T> annotationClass),该方法支持通过泛型直接返回注解对象。
package com.qutopia.bixi.spring.annotation; /** * annotation denoting test-class * * @author choaklin * @since 0.1.0 */ @Action("admin") public class AdminAction { public String index() { return "index"; } }
package com.qutopia.bixi.spring.annotation; /** * parsers for {@link Action} * * @author choaklin * @since 0.1.0 */ public class ActionAnnotationParser { public static void main(String[] args) { //①通过扫描获取到的Class对象 Class clazz = AdminAction.class; //②判断是否存在Action注解 Action action = (Action)clazz.getAnnotation(Action.class); if (action != null) { if (action.value() != null) { if (action.value().equals("admin")) { System.out.println(">> [AdminAction]是个管理控制器"); } else { System.out.println(">> [AdminAction]不是个管理控制器"); } } else { System.out.println(">> [AdminAction]对于注解[Action]未设置初始值"); } } } }
运行结果
>> [AdminAction]是个管理控制器
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于