首页 > 其他分享 >回顾注解开发

回顾注解开发

时间:2023-06-08 20:02:18浏览次数:28  
标签:String 回顾 Component value 开发 注解 annotation 属性

1. 回顾注解

注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。

我们来回顾一下:

● 第一:注解怎么定义,注解中的属性怎么定义?

● 第二:注解怎么使用?

● 第三:通过反射机制怎么读取注解?

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

package com.powernode.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = {ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Component {
    String value();
}

以上是自定义了一个注解:Component

该注解上面修饰的注解包括:Target注解和Retention注解,这两个注解被称为元注解。

Target注解用来设置Component注解可以出现的位置,以上代表表示Component注解只能用在类和接口上。

Retention注解用来设置Component注解的保持性策略,以上代表Component注解可以被反射机制读取。

String value(); 是Component注解中的一个属性。该属性类型String,属性名是value。

1.1 自定义注解  69

package com.powernode.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//回顾注解  69
//自定义注解

// 标注注解的注解,叫做元注解。@Target注解用来修饰@Component可以出现的位置。
// 以下表示@Component注解可以出现在类上、属性上。
//@Target(value = {ElementType.TYPE, ElementType.FIELD})
// 以下表示@Component注解可以出现在类上
//@Target(value = {ElementType.TYPE})
// 使用某个注解的时候,如果注解的属性名是value的话,value可以省略。
//@Target({ElementType.TYPE})
// 使用某个注解的时候,如果注解的属性值是数组,并且数组中只有一个元素,大括号可以省略。
@Target(ElementType.TYPE)
// @Retention 也是一个元注解。用来标注@Component注解最终保留在class文件当中,并且可以被反射机制读取。
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {

    // 定义注解的属性
    // String是属性类型
    // value是属性名
    String value();

    // 其他的属性
    // 属性类型String
    // 属性名是name
    //String name();

    // 数组属性
    // 属性类型是:String[]
    // 属性名:names
    //String[] names();

    //int[] ages();

    //int age();

}

2. 注解怎么使用? 70

package com.powernode.bean;

//使用自定义注解  70

import com.powernode.annotation.Component;

//@Component(属性名 = 属性值, 属性名 = 属性值, 属性名 = 属性值....)
//@Component(value = "userBean")
// 如果属性名是value,value可以省略。
@Component("userBean")
public class User {
}

用法简单,语法格式:@注解类型名(属性名=属性值, 属性名=属性值, 属性名=属性值......)

userBean为什么使用双引号括起来,因为value属性是String类型,字符串。

另外如果属性名是value,则在使用的时候可以省略属性名

2.1 通过反射机制怎么读取注解?70

package com.powernode.client;

import com.powernode.annotation.Component;

/**
 * 通过反射机制读取注解  70
 **/
public class ReflectAnnotationTest1 {
    public static void main(String[] args) throws Exception{
        // 通过反射机制怎么读取注解
        // 获取类
        Class<?> aClass = Class.forName("com.powernode.bean.User");
        // 判断类上面有没有这个注解
        if (aClass.isAnnotationPresent(Component.class)) {
            // 获取类上的注解
            Component annotation = aClass.getAnnotation(Component.class);
            // 访问注解属性
            System.out.println(annotation.value());
        }
    }
}

回顾注解开发_System

3. 注解之组件扫描原理  71

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

提示文件路径中不可有中文,所以这里我将代码放在

E:\java\spring6buchong的course17目录中

E:\java\spring6buchong\course17\src\main\java\com\powernode\client

ComponentScan

package com.powernode.client;

import com.powernode.annotation.Component;

import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 注解之组件扫描原理  71
 **/
public class ComponentScan {
    public static void main(String[] args){
        Map<String,Object> beanMap = new HashMap<>();
        // 目前只知道一个包的名字,扫描这个包下所有的类,当这个类上有@Component注解的时候,实例化该对象,然后放到Map集合中。
        String packageName = "com.powernode.bean";
        // 开始写扫描程序。
        // . 这个正则表达式代表任意字符。这里的"."必须是一个普通的"."字符。不能是正则表达式中的"."
        // 在正则表达式当中怎么表示一个普通的"."字符呢?使用 \. 正则表达式代表一个普通的 . 字符。
        String packagePath = packageName.replaceAll("\\.", "/");
        //System.out.println(packagePath);
        // com是在类的根路径下的一个目录。getSystemClassLoader系统类加载器
        URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
        String path = url.getPath();
        //System.out.println(path);
        // 获取一个绝对路径下的所有文件
        File file = new File(path);
        File[] files = file.listFiles();//获取bean目录下的所有子文件
        Arrays.stream(files).forEach(f -> {
            try {
                //System.out.println(f.getName());
                //System.out.println(f.getName().split("\\.")[0]);
                String className = packageName + "." + f.getName().split("\\.")[0];
                //System.out.println(className);
                // 通过反射机制解析注解
                Class<?> aClass = Class.forName(className);
                // 判断类上是否有这个注解
                if (aClass.isAnnotationPresent(Component.class)) {
                    // 获取注解
                    Component annotation = aClass.getAnnotation(Component.class);
                    String id = annotation.value();
                    // 有这个注解的都要创建对象
                    Object obj = aClass.newInstance();
                    beanMap.put(id, obj);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        });

        System.out.println(beanMap);
    }
}

回顾注解开发_属性值_02

标签:String,回顾,Component,value,开发,注解,annotation,属性
From: https://blog.51cto.com/u_15784725/6442775

相关文章

  • 使用HbuilderX3.8.3_把开发的小程序发布为Html5页面上传到_免费托管空间---uniapp_小
      找了很久,毕竟自己也是做测试,本来想买个服务器来着,由于了一下,还是给我找到了最终~自己做的小程序想部署,又不想买阿里云服务器,部署到阿贝云也不错,阿贝云会给开发者提供, 免费虚拟主机和免费的云服务器,最近我用了一段时间感觉还很不错也很稳定我测试用完全够用了,现......
  • Java开发工程师学习日记(十)
    1.谈谈Java线程池使用的优势:(1)Java线程池是一定数量的线程集合,线程的频繁创建与销毁消耗了操作系统与内存的大量资源,使用线程池使得减少了线程创建与销毁的资源浪费。(2)使用线程池可以提高程序的响应速度,通过复用已存在的线程,无需等待新线程的创建便能立即执行。(3)进行线程并发数的......
  • 微信小程序开发(一)基础概念汇总
    大家好,我是千与千寻,最近开始涉及小程序开发了,学一学最后做出来一个项目,最开始进入微信小程序开发的时候,如果学过Vue框架接触微信小程序开发的速度会非常快。我准备顺便开设一个专题,进行讲解微信小程序的开发理论复习。大家一起学习进步~一、微信小程序的开发步骤微信小程序是一种轻......
  • win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测
    (1)制作目标检测数据集使用labelimg软件进行图片的标注如图所示举一个例子:点击open,导入等待标注的图片,进行目标的标注后生成标注从config文件,数据分为train_img文件夹与train_ano文件,图片与标注的信息文件。一般每一个class至少要有40张以上图片数据。(2)建立训练模型模型的选择有......
  • Java开发工程师学习日记(九)
    1.TCP与UDP网络传输协议方面:TCP的传输报文形式比UDP的传输形式更加复杂,因此UDP头部只有四个字段,因此传输效率比较,TCP<UDP2.数组或者字符串的null值含义:null表示字段或者变量还没有确定的值,3.IP地址的分类:A类:0.0.0.0~127.255.255.255B类:128.0.0.0~191.255.255.255C类:192.0.0.0~......
  • 广州APP开发公司怎么选?优秀的APP开发公司必须具备这四点!
    随着移动端市场的蓬勃发展,越来越多的企业开始意识到移动应用的重要性,APP开发更是成为了一种重要的商业模式。而广州作为我国互联网的重要城市之一,在信息化与数字经济领域发展较为迅速,也涌现出了大量的APP开发公司。但在众多APP开发公司中如何选择一个靠谱的合作伙伴呢?名锐讯动教大......
  • 自定义注解,mq消费
    1.解析注解方式的mq消费者2.注解的定义@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceJmqListener{Stringid()default"";String[]topics()default{};}3.注解的使用@ComponentpublicclassMqConsumer{@JmqLi......
  • CRM管理系统的开发给企业带来什么作用?全方位实现客户管理!
    CRM管理系统的开发给企业带来什么作用?随着互联网技术的快速发展,市场竞争的加剧,企业越来越注重CRM管理系统的建立,以提高客户满意度和忠诚度。为此,CRM管理系统成为企业管理客户关系的重要工具,能全方位实现客户管理。广州名锐讯动系统开发公司将带大家探讨CRM管理系统的开发给企业带来......
  • 小治同学的JAVAWEB学习笔记-Junit&反射&注解
    Junit单元测试Junit使用:白盒测试 步骤 1.定义一个测试类(测试用类) 建议: 测试类名:北侧是的类+Test 包名:XXX.XXX.XX.Test 2.定义测试方法:可以独立运行 建议: 方法名:test测试的方法名 返回值void 参数列表空参 3.给方法加@Test 判定结果 1.红......
  • 做开发5年,这8个高效开发好习惯我悟了
    优秀的Web开发人员工作效率更高,因为他们拥有丰富的经验和良好的习惯。工作多年,我有一些自己了解的习惯分享给大家,都曾让我受益,做开发5年了,今天来跟大家分享一下我的感想。✍......