仿写SpringIoc

news2024/9/27 7:26:02

1.SpringIoc简单注解

1.1 Autowired

package com.qcby.iocdemo1.annotation;

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

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

1.2 Component

package com.qcby.iocdemo1.annotation;

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

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

2.创建一个controller和一个UserService对象,为后面案例展示提供方便

2.1 controller

package com.qcby.iocdemo1.entity;

import com.qcby.iocdemo1.annotation.Autowired;
import com.qcby.iocdemo1.annotation.Component;

@Component
public class TestController {
    @Autowired
    private UserService userService;
    public void test(){
        userService.addUser("zhangsan",18);
    }
}

2.2 UserService

package com.qcby.iocdemo1.entity;

import com.qcby.iocdemo1.annotation.Component;

@Component
public class UserService {

    public void addUser(String name, int age) {
        System.out.println(name);
        System.out.println(age);
    }
}

3.Ioc实现类

package com.qcby.iocdemo1.ioc;

import com.qcby.iocdemo1.annotation.Autowired;
import com.qcby.iocdemo1.annotation.Component;
import jdk.nashorn.internal.ir.ContinueNode;
import org.springframework.objenesis.instantiator.basic.NewInstanceInstantiator;

import java.beans.Beans;
import java.io.File;
import java.io.FileNotFoundException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;

public class SpringIOC {
    private String basePath;
    private String basePackage;
    private List<String> beanNames;
    private List<String> filePaths;
    private Map<String, Object> beans = new HashMap<>();

    private void initPath() {
        //设置三个包所在文件夹的绝对路径
        basePath = "D:\\gitcode\\IocDemo1\\src\\main\\java\\com\\qcby\\iocdemo1\\";
        //设置包名
        basePackage = "com.qcby.iocdemo1";
    }

    private void scan() throws FileNotFoundException {
        //创建文件夹对象
        File file = new File(basePath);
        //filePaths集合放置的是文件的绝对路径
        filePaths = new ArrayList<>();
        if (file.exists()) {
            Queue<File> queue = new LinkedList<>();
            //放文件夹下的子文件夹及文件
            queue.add(file);
            while (!queue.isEmpty()) {
                File poll = queue.poll();
                //队首文件出队
                if (poll.isDirectory()) {
                    //判断是否为文件夹,如果是把文件夹里的子文件夹和文件放入队列
                    File[] files = poll.listFiles();
                    for (File file1 : files) {
                        queue.add(file1);
                    }
                } else {
                    filePaths.add(poll.getPath());
                    //如果是文件把文件的路径放入filepaths
                }
            }
        } else {
            throw new FileNotFoundException(basePath + "没有找到");
        }
    }

    private void initBeanNames() {
        for (String s : filePaths) {
            //遍历filepaths
            String replace = s.replace(basePath, "");
            //将每个的前缀变成"",变成相对路径
            if (replace.endsWith(".java")) {
                replace = replace.substring(0, replace.length() - 5);
                //文件名以.java结尾的文件,去掉后缀
            }
            char[] chars = replace.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                if (chars[i] == '\\') {
                    chars[i] = '.';
                }
            }
            //将文件路径的/变成.
            beanNames.add(basePackage + "." + new String(chars));
            //将路径以保命+文件相对路径的形式添加到路径集合中
        }
    }

    public void initBeans(){
        for (String beanName : beanNames) {
            try {
                Class<?> aClass = Class.forName(beanName);
                //通过路径获取每个类的对象
                Annotation[] declaredAnnotations = aClass.getDeclaredAnnotations();
                //获取每个对类的注解
                for (Annotation declaredAnnotation : declaredAnnotations) {
                    //遍历注解,找到注解为component的注解
                    if (declaredAnnotation instanceof Component) {
                        //有的话,把类对象转化为实例对象,按照路径:对象的形式加入beans集合中
                        Object o = aClass.newInstance();
                        beans.put(aClass.getName(), o);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        for (Map.Entry<String, Object> entry : beans.entrySet()) {
            //遍历每一个路径:对象的键值对
            Field[] declaredFields = entry.getValue().getClass().getDeclaredFields();
            //获取该类的属性对象
            for (Field field : declaredFields) {
                Annotation[] declaredAnnotations = field.getDeclaredAnnotations();
                //遍历属性对象,获取属性上的注解
                for (Annotation annotation : declaredAnnotations) {
                    //遍历注解,判断该注解是否为autowired
                    if (annotation instanceof Autowired) {
                        //获取该属性的类型的名称
                        String name = field.getType().getName();
                        //找到该数据类型的实例对象
                        Object o = beans.get(name);
                        field.setAccessible(true);
                        try {
                            //把实例对象放入该属性中
                            field.set(entry.getValue(), o);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    public SpringIOC(){
        initPath();
        try {
            scan();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
        beanNames=new ArrayList<>();
        initBeanNames();
    }
    public Object getInstance(String beanName){
        return beans.get(beanName);
    }
}

4.使用test测试

        SpringIOC springIOC=new SpringIOC();
        springIOC.initBeans();
        TestController instance = (TestController)springIOC.getInstance(TestController.class.getName());
        instance.test();

5.运行结果

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

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

相关文章

Git 快速上手

这个文档适用于需要快速上手 Git 的用户&#xff0c;本文尽可能的做到简单易懂 ❤️❤️❤️ git 的详细讲解请看这篇博客 Git 详解&#xff08;原理、使用&#xff09; 1. 什么是 Git Git 是目前最主流的一个版本控制器&#xff0c;并且是分布式版本控制系统&#xff0c;可…

音视频开发—FFmpeg处理流数据的基本概念详解

文章目录 多媒体文件的基本概念相关重要的结构体操作数据流的基本步骤1.解复用&#xff08;Demuxing&#xff09;2.获取流&#xff08;Stream&#xff09;3. 读取数据包&#xff08;Packet&#xff09;4. 释放资源&#xff08;Free Resources&#xff09;完整示例 多媒体文件的…

聚焦云技术,探讨 AGI 时代的云原生数据计算系统

6月22日&#xff0c;开源中国社区在上海举办了 OSC 源创会活动&#xff0c;本期活动以「云技术」为主题&#xff0c;邀请了来自华为 openEuler、字节跳动、AutoMQ 等厂商的技术大咖进行分享&#xff0c;拓数派作为云原生数据计算领域的引领者&#xff0c;受邀参与了本次活动&am…

智慧城市可视化页面怎么做?免费可视化工具可以帮你

智慧城市是一个综合性的概念&#xff0c;广泛应用于各个领域&#xff0c;如基础设施建设、信息化应用、产业经济发展、市民生活品质等。 可视化页面的制作也是一个综合性的过程&#xff0c;需要确定展示内容、数据收集与处理、设计可视化元素等多个环节紧密配合。 1. 明确展示…

MySQL Innodb存储引擎中,当页默认的大小是16K时,页中最多存放多少行的记录?

1、题目引入 Innodb存储引擎是面向行的(row-oriented)&#xff0c;也就是说数据的存放按行进行&#xff0c;每页存放的行记录是有硬性定义的&#xff0c;当页默认的大小是16K时&#xff0c;页中最多存放多少行的记录&#xff1f; A、1600 行B、8192 行C、16383 行D、7992 行 …

occ geo

随笔 - 12 文章 - 18 评论 - 117 阅读 - 13万 opencascade造型引擎功能介绍 现今的CAD 系统大多通常都基于CAD 系统提供的二次开发包&#xff0c;用户根据要求定制符合自己要求的功能。AutoCAD就提供了AutoLISP、ADS 等都是比较通用的开发工具包。UG 也提供了多种二次开发…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址&#xff1a;3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

机器学习笔记:初始化0的问题

1 前言 假设我们有这样的两个模型&#xff1a; 第一个是逻辑回归 第二个是神经网络 他们的损失函数都是交叉熵 sigmoid函数的导数&#xff1a; 他们能不能用0初始化呢&#xff1f; 2 逻辑回归 2.1 求偏导 2.1.1 结论 2.1.2 L对a的偏导 2.1.3 对w1&#xff0c;w2求偏导 w2同…

k8s record 20240708

一、PaaS 云平台 web界面 资源利用查看 Rancher 5台 CPU 4核 Mem 4g 100g的机器 映射的目录是指docker重启后&#xff0c;数据还在 Rancher可以创建集群也可以托管已有集群 先docker 部署 Rancher&#xff0c;然后通过 Rancher 部署 k8s 想使用 kubectl 还要yum install 安…

中国AI大模型论文数量全球第一,清华力压麻省理工、斯坦福

论文是研究新技术、开发新产品获取“图纸”的重要途径之一&#xff0c;OpenAI的研究人员正是借鉴了Transformer的论文&#xff08;被引用超过9万次&#xff09;&#xff0c;才开发出了对全球各行业影响巨大的产品ChatGPT。 而论文的数量、通过率和被引用次数是衡量一个国家科技…

电脑文件夹怎么设置密码?让你的文件更安全!

在日常使用电脑的过程中&#xff0c;我们常常会有一些需要保护的个人文件或资料。为了防止这些文件被他人未经授权访问&#xff0c;对重要文件夹设置密码是一种有效的保护措施&#xff0c;可是电脑文件夹怎么设置密码呢&#xff1f;本文将介绍2种简单有效的方法帮助您为电脑文件…

红酒与运动后的恢复:健康的双重助力

在繁忙的都市生活中&#xff0c;运动已成为许多人追求健康与活力的方式。当汗水洒落&#xff0c;肌肉得到锻炼&#xff0c;一场酣畅淋漓的运动后&#xff0c;身心仿佛得到了洗礼。而在这份宁静与满足之余&#xff0c;你是否想过&#xff0c;一杯优雅的红酒也能为你的运动后恢复…

以SGET协会OSM标准首创有662引脚的OSM模组——凌华智能引领嵌入式运算市场

在可焊接的45 x 45mm尺寸上提升功率 开启嵌入式运算发展的新时代 摘要&#xff1a; 1.开放式标准模块(OSM™)&#xff0c;最大尺寸仅45 x 45mm&#xff0c;采用零开销的模块化系统简化生产&#xff0c;并提供662个引脚以增强小型化和物联网应用。 2.凌华智能提供基于NXP i.M…

二叉树中的最大路径和(Java版)

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

AI自动生成PPT哪个软件好?高效制作PPT就用这4个

学生时期做各种小组作业需要做PPT&#xff0c;毕业后开始上班每周大大小小的各种会议和汇报&#xff0c;也少不了PPT的折磨。 倘若你也刚好有这种烦恼&#xff0c;那么不妨试试下面我给大家安利的这4款AI自动生成PPT免费软件~保准你用上以后可不再为PPT制作而发愁&#xff01;…

面向过程编程详解

目录 前言1. 面向过程编程的定义2. 面向过程编程的特点2.1 过程和函数2.2 顺序执行2.3 全局变量2.4 控制结构 3. 面向过程编程的应用场景3.1 系统级编程3.2 科学计算3.3 小型项目 4. 面向过程编程的优缺点4.1 优点4.2 缺点 5. 代表性的编程语言5.1 C语言5.2 Pascal5.3 Fortran …

【LLM大模型】开发基于云的RAG应用,使用开源 LLM

检索增强生成 (RAG)通常用于开发定制的 AI 应用程序&#xff0c;包括 聊天机器人、推荐系统和其他个性化工具。该系统利用向量数据库和 大型语言模型 (LLM)的优势来提供高质量的结果。 为任何 RAG 模型选择合适的 LLM 非常重要&#xff0c;需要考虑成本、隐私问题和可扩展性等…

仿写SpringMVC

1.创建简单的注解 1.1 Controller package com.heaboy.annotation;import java.lang.annotation.*;Documented Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) public interface Controller { } 1.2 RequestMapping package com.heaboy.annotation;import …

喜讯|华院钢铁行业大模型入选“2024全国企业新质生产力赋能典型案例”

7月2日&#xff0c;由中国科学院主管、科学出版社主办的商业周刊《互联网周刊》&#xff08;CIW&#xff09;联合德本咨询&#xff08;DBC&#xff09;、中国社会科学院信息化研究中心&#xff08;CIS&#xff09;发布了“2024全国企业新质生产力赋能典型案例”。华院计算技术&…