(22) 回顾注解
2026/4/28 13:09:06 网站建设 项目流程

注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发
我们来回顾一下:

  • 第一:注解怎么定义,注解中的属性怎么定义?
  • 第二:注解怎么使用?
  • 第三:通过反射机制怎么读取注解?

注解怎么定义,注解中的属性怎么定义?

packagecom.powernode.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target(value={ElementType.TYPE})@Retention(value=RetentionPolicy.RUNTIME)public@interfaceComponent{Stringvalue();}

以上是自定义了一个注解:Component
该注解上面修饰的注解包括:Target注解和Retention注解,这两个注解被称为元注解。
Target注解用来设置Component注解可以出现的位置,以上代表表示Component注解只能用在类和接口上。
Retention注解用来设置Component注解的保持性策略,以上代表Component注解可以被反射机制读取。
String value(); 是Component注解中的一个属性。该属性类型String,属性名是value。
注解怎么使用?

packagecom.powernode.bean;importcom.powernode.annotation.Component;@Component(value="userBean")publicclassUser{}

用法简单,语法格式:@注解类型名(属性名=属性值, 属性名=属性值, 属性名=属性值…)
userBean为什么使用双引号括起来,因为value属性是String类型,字符串。
另外如果属性名是value,则在使用的时候可以省略属性名,例如:

packagecom.powernode.bean;importcom.powernode.annotation.Component;//@Component(value = "userBean")@Component("userBean")publicclassUser{}

通过反射机制怎么读取注解?
接下来,我们来写一段程序,当Bean类上有Component注解时,则实例化Bean对象,如果没有,则不实例化对象。
我们准备两个Bean,一个上面有注解,一个上面没有注解。

packagecom.powernode.bean;importcom.powernode.annotation.Component;@Component("userBean")publicclassUser{}
packagecom.powernode.bean;publicclassVip{}

假设我们现在只知道包名:com.powernode.bean。至于这个包下有多少个Bean我们不知道。哪些Bean上有注解,哪些Bean上没有注解,这些我们都不知道,如何通过程序全自动化判断。

packagecom.powernode.test;importcom.powernode.annotation.Component;importjava.io.File;importjava.net.URL;importjava.util.Arrays;importjava.util.Enumeration;importjava.util.HashMap;importjava.util.Map;/** * @author 动力节点 * @version 1.0 * @className Test * @since 1.0 **/publicclassTest{publicstaticvoidmain(String[]args)throwsException{// 存放Bean的Map集合。key存储beanId。value存储Bean。Map<String,Object>beanMap=newHashMap<>();StringpackageName="com.powernode.bean";Stringpath=packageName.replaceAll("\\.","/");URLurl=ClassLoader.getSystemClassLoader().getResource(path);Filefile=newFile(url.getPath());File[]files=file.listFiles();Arrays.stream(files).forEach(f->{StringclassName=packageName+"."+f.getName().split("\\.")[0];try{Class<?>clazz=Class.forName(className);if(clazz.isAnnotationPresent(Component.class)){Componentcomponent=clazz.getAnnotation(Component.class);StringbeanId=component.value();Objectbean=clazz.newInstance();beanMap.put(beanId,bean);}}catch(Exceptione){e.printStackTrace();}});System.out.println(beanMap);}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询