Java反射机制 手写springioc

news/2025/3/6 13:30:48/文章来源:https://www.cnblogs.com/enjoy999/p/18754958

Java的反射机制允许程序在运行时访问对象的属性和方法,基于这一特性,Spring框架实现了控制反转(IoC)容器,这是Spring框架核心功能之一。IoC容器减少了对象间的耦合和对象的创建责任,它允许开发者通过配置来管理对象的生命周期和依赖关系。以下是通过Java基础的反射机制手动实现一个简易的Spring IoC容器的过程。

首先,创建一个用于标记需要被IoC容器管理的类的注解:

import java.lang.annotation.*;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
}
 
 

接下来,定义一个IoC容器类,用于注册和获取Bean:

import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;public class SimpleIoC {private Map<String, Object> beanMap = new HashMap<>();// 初始化IoC容器,扫描加载所有的Beanpublic SimpleIoC(String basePackage) throws Exception {ClassLoader classLoader = SimpleIoC.class.getClassLoader();URL url = classLoader.getResource(basePackage.replace(".", "/"));File basePackageDirectory = new File(url.toURI());for (File file : basePackageDirectory.listFiles()) {String fileName = file.getName();if (fileName.endsWith(".class")) {String className = basePackage + "." + fileName.replace(".class", "");Class<?> cls = classLoader.loadClass(className);if (cls.isAnnotationPresent(Component.class)) {// 将类的首字母变为小写作为bean的名称String beanName = toLowerCaseFirstOne(cls.getSimpleName());Object beanInstance = cls.getDeclaredConstructor().newInstance();beanMap.put(beanName, beanInstance);}}}}// 获取Bean的方法public Object getBean(String name) {return beanMap.get(name);}private String toLowerCaseFirstOne(String s) {if (Character.isLowerCase(s.charAt(0)))return s;elsereturn (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();}
}
 
 

这个简易的IoC容器会在初始化时扫描指定包下的所有类,如果类上有 @Component注解,就会创建该类的实例并将其保存在一个Map中,名称通常会将类名的首字母小写作为键。

现在,假设你有一个类叫 ExampleService,你希望它被IoC容器管理:

@Component
public class ExampleService {public void execute() {System.out.println("Service method executing...");}
}
 
 

接下来,你可以使用以下方式初始化IoC容器,并获取到 ExampleService的实例:

public class Application {public static void main(String[] args) throws Exception {// 初始化IoC容器SimpleIoC simpleIoC = new SimpleIoC("你的包名");// 从IoC容器中获取实例ExampleService exampleService = (ExampleService) simpleIoC.getBean("exampleService");// 使用实例的方法exampleService.execute();}
}
 
 

这是一个非常基础的Spring IoC容器的实现方法。当然,真正的Spring IoC容器功能远不止这些,它还支持依赖注入、生命周期管理、配置方法等更高级和复杂的功能。但是通过这个简单的例子,你可以理解IoC容器的基本原理以及反射在其中的作用。在实际应用中,你通常会使用Spring框架提供的IoC容器,这样可以更加专注业务逻辑的实现,而不需要自己维护这样一个容器。

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

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

相关文章

matlab调用cplex验证车辆路径问题的数学模型有效性的代码问题

在关于时间的约束条件中,设置了关于时间的决策变量Tik大于等于0,但在求解完成后,发现该变量的取值仍然会出现负数的情况,还有的取值为极大值,但最终的车辆服务时间的连续性不受影响,求助该怎么解决这个问题?关于时间变量的取值有图片示例: 程序的代码也附上,未经允许代…

腾讯出品!这款Markdown神器让你码字效率翻倍,双模式编辑太香了!

由腾讯开源的CherryMarkdown编辑器,集思维导图式大纲写作与专业分屏模式于一身,支持实时预览、流程图绘制、多主题切换等硬核功能,助你轻松驾驭技术文档、博客写作、会议纪要等多种场景!嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学…

AI 在 Java Web 开发中的变革性应用:重塑开发未来

1. 智能代码生成与优化:开启高效开发的新纪元 在传统的 Java Web 开发中,编写基础代码往往占据了大量的时间和精力,尤其是重复性的模板代码。然而,AI 的出现彻底改变了这一现状。通过自然语言处理(NLP)技术,AI 能够理解开发者的自然语言描述,并自动生成高质量的基础代码…

20242931 2024-2025-2 《网络攻防实践》第一周作业

20242931 2024-2025-2 《网络攻防实践》第一周作业 1. 知识点梳理与总结 1.1 攻击机、靶机、SEED虚拟机、蜜网网关和蜜罐技术简介攻击机(Attacker Machine):攻击机是攻击者的操作平台,用于模拟各种网络攻击行为,测试靶机的安全性,并验证攻击技术的有效性。它是网络攻防实…

通达信打造个性化的文本标记系统

通达信的指标体系以数字为主,文本字符串的可行操作很少。 之前,尝试了无数方法,终于通过DLL,可以把通达信的文字传入到DLL中。 通达信如何向dll传递字符串​mp.weixin.qq.com/s?__biz=MzIxNzUyNTI4MA==&mid=2247483755&idx=1&sn=eb187f4f04c92c08fd45bd7f970b…

【VMware by Broadcom】VMware 产品套件(2025)

VMware 被 Broadcom 收购后(现为 VMware by Broadcom),重新调整了其产品部门并最终优化为了四个,分别是:VMware Cloud Foundation(VCF)部门、Application & Network Security(ANS)部门、VMware Tanzu 部门以及 VeloCloud 部门。VMware Cloud Foundation(VCF)部门…

变量命名不规范我被deepseek骗了

首先是一个实体类@Data public class Dto {private String mNumber; } 前端传来{"mNumber:"123"}为null的情况 编译之后我们看看class文件:getMNumberpublic class Dto {private String mNumber;public Dto() {}public String getMNumber() {return this.mNum…

GPT-4.5 感觉有点拉胯,但其实是 OpenAI 迄今为止最大的一步赌注

Alberto RomeroI. GPT-4.5 就是起跳前的助跑那一步 OpenAI 推出了 GPT-4.5(官方博客、系统卡片、演示视频),这是他们最新也是目前最大的一款 AI 模型。他们其实一年多前就开始放风,说它叫 Orion,结果很多人还以为是 GPT-5。现在终于来了……但感觉吧,有点拉胯。至少看起来…

GPT 4.5 可能是戳破 AI 泡沫的模型

GPT 4.5 可能是戳破 AI 泡沫的模型 Andrew Zuo本文点评:在AI技术狂飙突进的同时,也有许多声音包括本文的作者在内都认为AI行业正陷入巨大泡沫,技术突破逐渐停滞,高昂的硬件成本与资本退潮或将引爆寒冬。然而,这些观点大多忽视了技术的本质价值,真正值得关注的并非模型参数…

前端静态页面放在oss上cdn上的配置

0. 这次改造的原因问题1:前端发布的过程中由于使用了单pod,发布完pod在启动的时候服务对外不可用问题2:如果用滚动更新可能会带来的问题 发布过程中,机器A发布完了,机器B没有发布完。 用户访问一个页面,页面请求打在 A上,然后js资源打在B上,B上没有然后就命中了404逻辑…

Nginx 工作机制参数设置(详细讲解说明)

1. Nginx 当中的 master-worker 机制原理 master-worker 工作原理图:一个 master 管理多个 worker[root@localhost ~]# cd /usr/local/nginx/ [root@localhost nginx]# ls auto CHANGES.ru conf contrib html logs man proxy_temp sbin …

无钥匙进入系统和无钥匙启动系统PEPS

经纬恒润的无钥匙进入及启动系统简称 PEPS (Passive Entry Passive Start) 系统,采用 RFID(无线射频识别)技术,实现无需按动遥控器即可进入车内以及一键启动发动机等功能。 经纬恒润的无钥匙进入及启动系统简称 PEPS (Passive Entry Passive Start) 系统,采用 RFID(无…