编程技术分享平台

网站首页 > 技术教程 正文

Java基础之Annotation-注解处理器,实现简版FactoryBean

xnh888 2024-10-19 15:59:45 技术教程 22 ℃ 0 评论

在上一篇文章[Java基础之Annotation]中介绍了Annotation的的基础知识,并自定义了Entity和EntityProperty这两个注解,本篇将介绍如何利用Entity来自动注入bean,EntityProperty初始化bean。

注解处理器

自JDK1.5之后,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力,当注解被标记为运行时可见@Retention(RetentionPolicy.RUNTIME),就可以通过反射来处理注解。

常用API:

  • T getAnnotation(Class annotationClass):返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

  • Annotation[] getAnnotations():返回该程序元素上存在的所有注解。

  • boolean is AnnotationPresent(ClassannotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.

  • Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释(如果没有注释直接存在于此元素上,则返回长度为零的一个数组)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

简版FactoryBean实现

需求:写个bean工厂,通过bean工厂可以获得所有添加了注解的bean对象,且bean对象的成员属性的值可以通过注解来设置。

实现:

定义Entity和EntityProperty两个注解:

  • Entity,添加了该注解的类会被BeanFactory自动加载,并实例会;

  • EntityProperty,通过该注解给bean的成员属性赋值(beanFactory在解析到成员属性有EntityProperty注解时,通过反射为其赋值);

目录结果如下图:

  • BeanFactory,遍历指定包下所有class文件,凡是添加@Entity注解的class会被实例化;

  • Car.java和User.java,User添加了注解,Car未添加注解,用于测试@Entity是否生效;

  • AnnotationClassUtil,加载指定包下的class文件,工具类;

  • AppAnnotation,入口类,有main方法;

目录结构

Entity.java注解类

Entity

EntityProperty.java注解类

EntityProperty

User.java

@Entity用于标识该类将会被自动注入;

@EntityProperty用于标识该类实例化时的初始值;

User.java

AnnotationClassUtil.java

主要是第38行

AnnotationClassUtil.java

BeanFactory.java

BeanFactory.java-1

BeanFactory.java-2

运行结果

只有User.java被自动注入,并且初始值也被正确赋予。

运行结果

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表