简单仿写SpringIOC

news2024/9/29 17:24:34

gitee地址(需要自取)ioc_Imitation: 简单仿写IOC (gitee.com) 

项目目录结构

 Autowired

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}

Component

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
}

HydService

@Component
public class HydService {

    public void test() {
        System.out.println("成功调用service方法");
    }
}

HydIOC

public class HydIOC {
//        包名加类名(没有.java后缀)
        private List<String> bean_names;
//        全类路径
        private List<String> file_paths;
//        main方法路径
        private String base_path;
//        包名
        private String base_package;
//        放类实例
        private Map<String,Object> beans = new HashMap<>();


        public HydIOC(String basepath, String basepackage) {

//                处理basepath和basepackage
//                basepath:/D:/javacode/myIOC/out/production/myIOC/com/hyd/springIOC/
//                处理成:D:\javacode\myIOC\out\production\myIOC\com\hyd\springIOC\
                basepath=basepath.substring(1).replace("/","\\");
                this.base_path=basepath;
//                形如:com.hyd.springIOC
                this.base_package=basepackage;
                try{
//                        扫描文件
                        scan_files();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                }
//                获取实例的名称集合
                this.bean_names = new ArrayList<>();
                init_bean_names();

        }

        /**
         * 生成bean_names
         */
        private void init_bean_names() {
                for (String file_path : this.file_paths) {
                        file_path = file_path.replace(this.base_path,"");
                        if (file_path.endsWith(".class")){
                                file_path = file_path.substring(0,file_path.length()-6);
                        }
                        String bean_name = this.base_package + "." + file_path.replaceAll(Matcher.quoteReplacement(File.separator),".");
                        this.bean_names.add(bean_name);
                }
        }

        /**
         * 扫描当前路径下的文件
         */
        private void scan_files() throws FileNotFoundException {
                File file = new File(this.base_path);
                this.file_paths = new ArrayList<>();
                if (file.exists()){
//                        新建一个用来处理文件的队列
                        LinkedList<File> file_lists = new LinkedList<>();
                        file_lists.add(file);
                        while (!file_lists.isEmpty()){
//                                取出一个文件进行处理
                                File temp_file = file_lists.removeFirst();
                                if (temp_file!=null){
//                                        判断是否为文件夹
                                        if (temp_file.isDirectory()){
//                                                是文件夹就把其子文件放到队列中
                                                File[] files = temp_file.listFiles();
                                                for (File file1 : files) {
                                                        file_lists.add(file1);
                                                }
                                        }else {
//                                                不是文件夹就把文件路径放到路径列表中
                                                this.file_paths.add(temp_file.getPath());
                                        }
                                }else {
                                        continue;
                                }
                        }
                }else {
                        throw new FileNotFoundException("找不到"+this.base_path+"路径下的文件");
                }
        }

        public void initBeans() {
                for (String bean_name : this.bean_names) {
                        try{
                                Class<?> cl = Class.forName(bean_name);
//                                获取类的全部注解
                                Annotation[] annotations = cl.getDeclaredAnnotations();
//                                判断所有注解汇中是否有Component注解
                                for (Annotation annotation : annotations) {
                                        if (annotation instanceof Component){
//                                                有就把实例化对象放到map中
                                                Object o = cl.newInstance();
                                                this.beans.put(cl.getName(),o);
                                        }
                                }
                        } catch (ClassNotFoundException e) {
                                e.printStackTrace();
                        } catch (InstantiationException e) {
                                e.printStackTrace();
                        } catch (IllegalAccessException e) {
                                e.printStackTrace();
                        }
                }

//                处理Autowired注解的注入
//                遍历map所有的实例
                for (Map.Entry<String, Object> entry : this.beans.entrySet()) {
//                        获取实例中的域
                        Field[] fields = entry.getValue().getClass().getDeclaredFields();
//                        遍历所有的域
                        for (Field field : fields) {
//                                获取域的注解
                                Annotation[] annotations = field.getDeclaredAnnotations();
//                                遍历注解
                                for (Annotation annotation : annotations) {
//                                        判断注解中是否有Autowired注解
                                        if (annotation instanceof Autowired){
//                                                filed样例值:private com.hyd.springIOC.service.HydService com.hyd.springIOC.controller.HydController.hydService
//                                                name样例值:com.hyd.springIOC.service.HydService
                                                String name = field.getType().getName();
//                                                从map中获取对应的实例
                                                Object o = this.beans.get(name);
//                                                设置字段为可访问状态
                                                field.setAccessible(true);
                                                try {
//                                                        将获取的对象实例 o 注入到当前字段所属的对象实例中
                                                        field.set(entry.getValue(),o);
                                                } catch (IllegalAccessException e) {
                                                        e.printStackTrace();
                                                }
                                        }
                                }
                        }
                }
        }

//        对外获取实例的方法
        public Object getInstance(String name) {
                return this.beans.get(name);
        }
}

HydController

@Component
public class HydController {
    @Autowired
    private HydService hydService;

    public void hydtest(){
        hydService.test();
    }
}

Main

public class Main {
    public static void main(String[] args) {

        String basepath = Main.class.getResource("").getPath();
//        获取Main的包名
        String basepackage = Main.class.getPackage().getName();
        HydIOC hydIOC = new HydIOC(basepath,basepackage);
        hydIOC.initBeans();
        HydController hydController = (HydController) hydIOC.getInstance(HydController.class.getName());
        hydController.hydtest();
    }
}

整体与之前的仿写MVC的思路相差不大,不做过多描述

跳转仿写MVC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云服务器centos7报错:Cannot find a valid baseurl for repo: base/7/x86_64

报错显示 我是使用FinalShell连接centos7&#xff1b; 如下图所示&#xff0c;尝试更新显示Cannot find a valid baseurl for repo: base/7/x86_64 网上找了很多教程最后没在点子上&#xff0c;最后我用gpt解决的&#xff0c;这里仅仅做一下记录&#xff08;因为我会忘记^_^&…

pnpm workspace使用教程【Monorepo项目】

目录 前言一、pnpm简介特点&#xff1a;对比 二、 创建项目添加文件 pnpm-workspace.yaml目录结构pnpm workspace: 协议修改配置文件执行 安装 三、命令解析执行包命令所有包操作命令 四、实例代码 前言 前面两篇&#xff0c;我们讲了 yarn workspace 和 lerna &#xff0c; …

枚举类 (enum)

目录 一、为什么要有枚举类&#xff1f; 二、枚举的简介 三、自定义枚举类 四、使用enum关键字 五、注意事项 一、为什么要有枚举类&#xff1f; 假如我们有这样的一个需求&#xff1a;设计季节类&#xff0c;并创建对象。 我们就需要以下操作&#xff0c;创建Season类&…

基于FPGA的数字信号处理(16)--定点数的舍入模式(7)6种舍入模式的总结

前言 在前面的6篇文章中&#xff0c;分别对6中舍入模式做了详细的介绍&#xff0c;本文在前文的基础上&#xff0c;再对这6种舍入模式做一个对比和总结。 6种舍入模式 在数据处理过程中&#xff0c;为了防止数据溢出而增加位宽是一种很常见的处理方式&#xff0c;但是随着算法链…

保姆级教程:Linux (Ubuntu) 部署流光卡片开源 API

流光卡片 API 开源地址 Github&#xff1a;https://github.com/ygh3279799773/streamer-card 流光卡片 API 开源地址 Gitee&#xff1a;https://gitee.com/y-gh/streamer-card 流光卡片在线使用地址&#xff1a;https://fireflycard.shushiai.com/ 等等&#xff0c;你说你不…

CVE-2024-6387Open SSH漏洞彻底解决举措(含踩坑内容)

一、漏洞名称 OpenSSH 远程代码执行漏洞(CVE-2024-6387) 二、漏洞概述 Open SSH是基于SSH协议的安全网络通信工具&#xff0c;广泛应用于远程服务器管理、加密文件传输、端口转发、远程控制等多个领域。近日被爆出存在一个远程代码执行漏洞&#xff0c;由于Open SSH服务器端…

记录|C#安装+HslCommunication安装

记录线索 前言一、C#安装1.社区版下载2.VS2022界面设置 二、HslCommunication安装1.前提2.安装3.相关文件【重点】 更新记录 前言 初心是为了下次到新的电脑上安装VS2022做C#上机位项目时能快速安装成功。 一、C#安装 1.社区版下载 Step1. 直接点击VS2022&#xff0c;跳转下…

项目实战--Spring Boot + GraphQL实现实时数据推送

背景 用户体验不断提升而3对实时数据的需求日益增长&#xff0c;传统的数据获取方式无法满足实时数据的即时性和个性化需求。 GraphQL作为新兴的API查询语言&#xff0c;提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架&#xff0c;利用GraphQL实现实时数据推…

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

【GeoTransformer系列】——粗配准 1.coarse_matching1.1 概要1.2 功能1.3 超参1.4 input1.5 output2 coarse_target2.1 概要2.2 功能2.3 input2.4 output在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在G…

叉车防撞系统:揭秘其多样化工作模式

叉车&#xff0c;作为物流仓储领域的重要工具&#xff0c;其安全性一直备受关注。随着科技的进步&#xff0c;叉车防撞系统应运而生&#xff0c;成为了叉车驾驶员的得力助手。那么&#xff0c;叉车防撞系统究竟是如何实现其安全防护的呢&#xff1f;让我们一同揭开&#xff0c;…

必看 | 最简单获取IP地址专用SSL证书的申请方法

申请IP地址专用的SSL证书并不像传统SSL证书那样普及&#xff0c;不是所有服务商都提供IP地址的SSL证书&#xff0c;因此需要仔细选择合适的服务商和流程进行操作申请&#xff0c;以此来实现IP地址访问的https。以下是最简单的IP地址专用SSL证书申请方法&#xff1a; 一、准备 …

YOLOv10改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

一、本文介绍 本文给大家带来的是YOLOv10最新改进&#xff0c;为大家带来最近新提出的InnerIoU的内容同时用Inner的思想结合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等损失函数&#xff0c;形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本损失函数&#xff0c;同时还结合了Focus和…

nprogress进度条插件

打开一个页面时&#xff0c;往往会伴随一些请求&#xff0c;并且会在页面上方出现进度条。它的原理时&#xff0c;在我们发起请求的时候开启进度条&#xff0c;在请求成功后关闭进度条&#xff0c;所以只需要在request.js中进行配置。 如下图所示&#xff0c;我们页面加载时发起…

一套完善的孕产妇保健信息化管理平台源码:管理了孕妇从怀孕开始到生产结束42天以内的一系列医院保健服务信息

数字化产科管理平台源码&#xff0c;智慧产科系统源码&#xff0c;采用java语言开发&#xff0c;前端框架为Vue&#xff0c;ElementUIMySQL数据库&#xff0c;前后端分离架构的数字化产科管理系统源码&#xff0c;自主版权&#xff0c;多个大型综合医院、妇幼保健院应用案例&am…

小米恢复联系人,跟着这2个步骤,让你的社交重回巅峰

当你突然发现小米手机里的联系人列表变得空空如也&#xff0c;是不是感觉就像失去了与外界沟通的“秘密武器”&#xff1f;别担心&#xff0c;这并不意味着你真的失去了他们。他们可能只是藏在了手机里的某个神秘角落&#xff0c;等待着你的召唤。接下来&#xff0c;小编将会介…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程&#xff0c;当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

基于STM32的智能加湿器

1.简介 基于STM32的加湿器发展前景非常乐观&#xff0c;这主要得益于其在技术、市场需求、应用场景以及政策支持等多方面的优势。STM32微控制器具备强大的处理能力和丰富的外设接口&#xff0c;能够实现精确的湿度监测和智能化控制。基于STM32的加湿器可以根据环境湿度自动调节…

如何在 Windows 10 上恢复未保存的 Word 文档

您是否整晚都在处理一个重要的 word 文件&#xff0c;但忘记保存它了&#xff1f;本文适合您。在这里&#xff0c;我们将解释如何恢复未保存的 word 文档。除此之外&#xff0c;您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生&#xff0c;每个人都了解丢失重要 W…

亚信安全新一代终端安全TrustOne2024年重磅升级

以极简新主义为核心&#xff0c;亚信安全新一代终端安全TrustOne自2023年发布以来&#xff0c;带动了数字化终端安全的革新。60%&#xff0c;安装部署及管理效率的提升&#xff1b;50%&#xff0c;安全管理资源的节省&#xff1b;100%&#xff0c;信创非信创场景的全覆盖。Trus…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0&#xff0c;然后 gym 版本是 0.22.0&#xff0c;python 版本是 3.8 &#xff0c;pygame 版本是 2.6.0 。 首先安装一下 gym&#xff1a; pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…