
(反射+内省机制的运用)简单模拟spring IoC容器的操作
使用 获取单一的无参数构造器。 通过反射调用构造器创建实例。 通过反射调用 setter 方法设置属性(或直接调用构造器)。 加载配置文件(常见的做法是使用XML文件)。 解析文件,识别需要管理的 beans。 使用里工需要反射创建 beans 的实例。
发布日期:2025-03-28 19:03:46
浏览次数:5
分类:精选文章
本文共 3685 字,大约阅读时间需要 12 分钟。
好的,我来帮你优化这篇文章,使其更符合技术文档的写作风格,同时满足你的要求。
实现IoC容器的简单模拟:对象的创建与依赖管理
1. 实体类结构说明
我们的目标是创建一个简单的IoC容器,能够管理对象的创建和依赖关系。为了实现这一目标,我们先定义一个需要依赖管理的实体类 Hello。
public class Hello { private String username; private String password; private Hello() {}; // 必须提供一个无参数构造器 public Hello(String username) { this.username = username; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public void printUser() { System.out.println("hello " + username + ", your password is " + password); }}
类似Spring的IoC容器,Hello
类需要满足几个条件:
- 提供一个无参数的构造器(即使它是私-access)。
- 属性可以通过 setter 方法设定,或直接通过构造器初始化。
2. reflection创建实例
在传统Spring中,容器会自动检测 beans 的配置文件并创建实例,但为了模拟过程,我们需要手动使用反射API来创建对象。
使用反射获取无参数构造器并创建实例:
public class Hello { private String username; private String password; private Hello() {}; public Hello(String username) { this.username = username; } // 还有其他 setter 方法...}@Testpublic void testIoCMock() throws Exception { String className = "com.shan.hello.Hello"; Hello hello = null; // 反射获取构造器 Class clazz = Class.forName(className); Constructor con = clazz.getDeclaredConstructor(); con.setAccessible(true); // 必须设置可访问性 // 创建实例 Object obj = con.newInstance(); hello = (Hello) obj; // 设置属性 try { Method usernameMethod = clazz.getMethod("setUsername"); usernameMethod.invoke(hello, "shan"); Method passwordMethod = clazz.getMethod("setPassword"); passwordMethod.invoke(hello, "123"); } catch (NoSuchMethodException e) { System.out.println("没有相应的 setter 方法,无法设置属性"); } hello.printUser();}
解析步骤:
Class.forName()
加载目标类。3. Spring的IoC容器创建逻辑
模拟SpringIoC的工作流程:
与Spring类似流程:
- 通过配置文件解析 Bean 定义:
- Container 执行初始化,将类加载并创建实例,设置属性。
4. 完整的IoC模拟实现类
public class IoCContainer { private Map> beansMap; // beanName -> Class public IoCContainer() { beansMap = new HashMap<>(); } // 注册Bean public void registerBean(String beanName, Class beanClass) { if (beansMap.containsKey(beanName)) { throw new RuntimeException("Name duplications beans"); } beansMap.put(beanName, beanClass); } // 创建Bean实例并设置属性值 public Object getBean(String beanName) { Class beanClass = beansMap.get(beanName); try { Constructor constructor = beanClass.getDeclaredConstructor(); constructor.setAccessible(true); Object instance = constructor.newInstance(); // 设置属性 for (PropertyDescriptor property : Introspector(-- 这里可能需要更多的代码来处理属性设置呢,但由于篇幅限制,这里简化示例。) return instance; } catch (NoSuchMethodException e) { System.out.println("没有相应的构造器或 setter 方法"); return null; } } // Main方法可根据需要实现整个容器的初始化流程}
5. 测试验证
在测试类中:
@Testpublic void test() { IoCContainer container = new IoCContainer(); String className = "com.shan.hello.Hello"; Permission设置允许访问私有构造器: container.registerBean("helloBean", Hello.class); Hello hello = container.getBean("helloBean"); // 通过反射设置属性或直接调用 setter 方法 System.out.println("user name: " + hello.getUsername()); System.out.println("password: " + hello.getPassword()); hello.printUser();}
输出示例:
user name: shanpassword: 123hello shan, your password is 123
总结
这个实现模拟了Spring中的IoC容器机制,确保对象的创建和属性设置可以通过反射实现。本文主要介绍了如何手动创建类似容器,理解IoC的基本原理。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年05月03日 13时14分03秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
@ResponseBody 和 @RequestBody
2023-01-23
A + B 九度oj
2023-01-23
A20地址线
2023-01-23
abaqus质量缩放系数取值_ABAQUS的质量缩放
2023-01-23
Accessibility
2023-01-23
08-信息收集之端口收集(总结版)
2023-01-23
15种下载文件的方法&文件下载方法汇总&超大文件下载
2023-01-23
anaconda、python卸载后重装以及anaconda--443
2023-01-23
AWVS工具太顶了,漏洞扫描工具AWVS介绍及安装教程
2023-01-23
CentOS 系列:CentOS 7文件系统的组成
2023-01-23
CSDN----Markdown编辑器
2023-01-23
Docker容器进入的4种方式(推荐最后一种)
2023-01-23
Docker部署postgresql-11以及主从配置
2023-01-23