简单仿写SpringIOC

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.springIOCthis.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.HydServiceString 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 {@Autowiredprivate 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.rhkb.cn/news/373453.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献笔记|综述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 题目&#xff1a;当大型语言模型遇到优化时 作者&#xff1a;Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 来源&#xff1a;arXiv 单位&#xff1a;华南理工大学 文章目录 When Large Language Model Meets Optimization…

Redis主从部署

文章目录 Redis主从部署1.下载安装Redis2.单点双副本主从配置1.修改配置信息2.修改配置文件redis.conf3.拷贝配置文件到每一个实例文件夹里4.修改每一个实例的端口和工作目录5.配置主从关系6.检查效果 3.哨兵模式监控主从1.创建实例目录2.复制配置文件并进行修改3.启动并测试 4…

Java增加线程后kafka仍然消费很慢

文章目录 一、问题分析二、控制kafka消费速度属性三、案例描述 一、问题分析 Java增加线程通常是为了提高程序的并发处理能力&#xff0c;但如果Kafka仍然消费很慢&#xff0c;可能的原因有&#xff1a; 网络延迟较大&#xff1a;如果网络延迟较大&#xff0c;即使开启了多线…

使用redis进行短信登录验证(验证码打印在控制台)

使用redis进行短信登录验证 一、流程1. 总体流程图2. 流程文字讲解&#xff1a;3.代码3.1 UserServiceImpl&#xff1a;&#xff08;难点&#xff09;3.2 拦截器LoginInterceptor&#xff1a;3.3 拦截器配置类&#xff1a; 4 功能实现&#xff0c;成功存入redis &#xff08;黑…

悠律凝声环Ringbuds Pro耳机:素皮纹理质感独一档,音质也拉满

悠律&#xff08;UMELODY&#xff09;推出的这款新品——凝声环开放式耳机&#xff0c;以其独特的设计风格和出色的音质表现赢得了众多消费者的喜爱。 在外观上&#xff0c;凝声环采用了时尚潮酷的设计理念&#xff0c;并且采用简约典雅素皮工艺&#xff0c;首次将“素皮”材料…

QT文件生成可执行的exe程序

将qt项目生成可执行的exe程序可按照以下步骤进行&#xff1a; 1、在qt中构建运行生成.exe文件&#xff1b; 2、从自定义的路径中取出exe文件放在一个单独的空文件夹中&#xff08;exe文件在该文件夹中的release文件夹中&#xff09;&#xff1b; 3、从开始程序中搜索qt&#xf…

提升Selenium在Chrome上的HTML5视频捕获效果的五个方法

在使用Selenium进行网页自动化测试时&#xff0c;捕获HTML5视频是一个常见的需求。然而&#xff0c;许多开发者发现&#xff0c;在使用Chrome浏览器时&#xff0c;视频捕获效果并不理想&#xff0c;经常出现视频背景为空白的问题。本文将概述五种方法&#xff0c;帮助提升Selen…

品牌渠道低价管控的思考与策略

消费者在购买产品时追求低价、货比三家&#xff0c;这无可非议。然而&#xff0c;产品低价就一定是好事吗&#xff1f;倘若品牌为了迎合消费者对低价的需求&#xff0c;一味追求低价引流&#xff0c;最终的结果只能是从源头压价&#xff0c;比如在原材料的选购、供应商的选择上…

校园运动用品租借租赁租体育用品平台设计

校园运动用品租借租赁租体育用品平台设计 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 基于web的校园运动用品租借平台主要有管理员和用户两个角色功能模块&#xff0c;管理员对后台对有相…

Python 接口自动化中,如何实现参数化测试?

在Python接口自动化中&#xff0c;参数化测试是一种非常重要的技术&#xff0c;它可以帮助我们更高效地执行大量的接口测试用例。参数化测试允许我们通过修改测试数据&#xff0c;多次执行同一个测试用例&#xff0c;以验证系统在不同输入情况下的行为。下面&#xff0c;我将从…

[高频 SQL 50 题(基础版)]第一千七百五十七题,可回收且低脂产品

题目&#xff1a; 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | low_fats | enum | | recyclable | enum | ---------------------- product_id 是该表的主键&#xff08;具有唯…

php简单商城小程序系统源码

&#x1f6cd;️【简单商城小程序】&#x1f6cd;️ &#x1f680;一键开启&#xff0c;商城搭建新体验&#x1f680; 你还在为繁琐的商城搭建流程头疼吗&#xff1f;现在&#xff0c;有了简单商城系统小程序&#xff0c;一切变得轻松又快捷&#xff01;无需复杂的编程知识&a…

羊大师:暑期不“胖”秘籍:羊奶滋养,细嚼慢咽是关键!

夏日炎炎&#xff0c;假期悠长&#xff0c;如何在享受悠闲时光的同时&#xff0c;保持轻盈体态&#xff0c;成了许多人心中的小秘密。今天&#xff0c;就让我们一起揭秘暑期不“胖”的秘籍&#xff0c;让羊奶的滋养与细嚼慢咽的智慧&#xff0c;成为你美丽夏日的守护神。 羊奶轻…

BUUCTF[堆][of_by_one]

堆中of_by_one 介绍&#xff1a; 严格来说 off-by-one 漏洞是一种特殊的溢出漏洞&#xff0c;off-by-one 指程序向缓冲区中写入时&#xff0c;写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。溢出字节为可控制任意字节 &#xff1a;通过修改大小(size…

一个项目学习Vue3---事件处理

学习下面代码&#xff0c;了解Vue3的事件处理 <!--条件和列表渲染--> <template><el-button v-on:click"countAdd" type"primary">count{{ count }}</el-button><el-button click"countAdd" type"primary"…

18.按键消抖模块设计(使用状态机,独热码编码)

&#xff08;1&#xff09;设计意义&#xff1a;按键消抖主要针对的时机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子就断开。因而在闭合以及断开的瞬…

解决centos yum和wget指令都用不了(换源)

先ping一下网络&#xff0c;看看能不能ping通&#xff0c;先排除是网络的问题 ping www.baidu.com有消息回传说明网络有连接&#xff0c;没有的话就要去把虚拟机的网络连接好&#xff08;CtrlC关闭&#xff09; 接下来写centos更换源 一般yum用不了&#xff0c;下载不来wget …

树莓派采集系统

树莓派&#xff08;Raspberry Pi&#xff09;是一款非常受欢迎的小型单板计算机&#xff0c;因其低成本、低功耗以及丰富的I/O接口&#xff0c;非常适合用来搭建数据采集系统。无论是环境监测、智能家居、工业自动化&#xff0c;还是科学实验&#xff0c;树莓派都能胜任。以下是…

苹果开发者取消自动续费

文档&#xff1a;https://support.apple.com/zh-cn/118428 如果没有找到订阅&#xff0c;那就是账号不对 取消订阅后&#xff0c;就不会自动续费了&#xff0c;如果不放心&#xff0c;可以把付款绑定的方式也取消

window 安装 openssl

文章目录 前言window 安装 openssl1. 下载2. 安装3. 配置环境变量4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话…