news 2026/5/23 15:52:49

(22) 回顾注解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(22) 回顾注解

注解的存在主要是为了简化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);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 13:21:38

(23)声明Bean的注解

负责声明Bean的注解&#xff0c;常见的包括四个&#xff1a; ComponentControllerServiceRepository 源码如下&#xff1a; package com.powernode.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.…

作者头像 李华
网站建设 2026/5/22 8:04:37

前端设计模式:详解、应用场景与核心对比

前端设计模式&#xff1a;详解、应用场景与核心对比 前端设计模式是解决前端开发中重复出现的问题的标准化解决方案&#xff0c;涵盖创建型、结构型、行为型三大类核心模式&#xff0c;同时包含前端特有的适配型模式&#xff08;如发布-订阅、MVVM等&#xff09;。本文结合前端…

作者头像 李华
网站建设 2026/5/22 12:35:51

JoltPhysics球体碰撞边缘优化:从理论到工程实践

JoltPhysics球体碰撞边缘优化&#xff1a;从理论到工程实践 【免费下载链接】JoltPhysics A multi core friendly rigid body physics and collision detection library, written in C, suitable for games and VR applications. 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华