手动实现IOC
spring官方实现的ioc是通过反射和xml技术实现的,下面我们可以根据这个思路简单实现一下IOC,此处省略构建项目,项目的整体结构如图

第一步,在resources目录下创建beans.xml文件
<beans>
<bean id="userDao" class="com.grouphy.aop.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.grouphy.aop.service.impl.UserServiceImpl"></bean>
</beans>
第二步,创建BeanFactory工厂类,这个类的作用就是利用反射和xml技术实现对象的实例化,代码如下
public class BeanFactory {
private static Map<String,Object> mp = new HashMap<>();
static{
try {
// 1、读取配置文件
InputStream resourceAsStream = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
// 2、解析xml
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(resourceAsStream);
// 3、编写xpath表达式
String xpath = "//bean";
// 4、获取所有签
List<Element> list = document.selectNodes(xpath);
// 5、遍历并创建对象实例,设置到map的bean标集合中
for (Element element : list) {
String id = element.attributeValue("id");
String className = element.attributeValue("class");
Object o = Class.forName(className).newInstance();
mp.put(id,o);
}
} catch (DocumentException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static Object getBean(String userId){
return mp.get(userId);
}
}
第三步,编写测试类
public class UserTest {
@Test
public void saveTest(){
IUserService userService = (IUserService) BeanFactory.getBean("userService");
userService.save(new User());
}
}
以上就是简单的ioc实现,
详细代码自行拉取:https://gitee.com/duy123456/spring/
手动实现IOC的更多相关文章
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- Spring中的IOC
在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简单介绍 IoC(InversionofControl):IoC就 ...
- Spring框架学习(7)spring mvc入门
内容源自:spring mvc入门 一.spring mvc和spring的关系 spring mvc是spring框架提供的七层体系架构中的一个层,是spring框架的一部分,是spring用于处理 ...
- spring容器启动过程理解
一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...
- Spring5源码分析之启动类的相关接口和注解
一些基础但是核心的知识总结: Spring Boot项目启动的时候需要加@Configuration. @ComponentScan @Configuration + @Bean 把第三方jar包注入 ...
- Java 基础知识整理 (待整理)
JVM之类加载器(ClassLoader)基本介绍 类加载器用于将class文件加载到JVM中去执行.下面介绍类加载器涉及到的基本概念和加载基本过程. 一.Java虚拟机与程序的生命周期 在运行Jav ...
- 一统江湖的大前端(10)——inversify.js控制反转
<大史住在大前端>前端技术博文集可在下列地址访问: [github总基地][博客园][华为云社区][掘金] 字节跳动幸福里大前端团队邀请各路高手前来玩耍,团队和谐有爱,技术硬核,字节范儿正 ...
- Spring 源码(3)Spring BeanFactory 是怎么创建的?
Spring创建 BeanFactory 的方式 按照Bean的配置方式手动创建可以分为两种: 使用XMl配置的Bean 这种方式使用xml配置文件配置Bean的信息并且设置扫描的路径,扫描到的包可以 ...
- Spring系列之IOC的原理及手动实现
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...
- 手动实现一个 IOC/DI 容器
第一章为源码解析. 第二章为实现一个简单的 IOC 容器. 第三章进阶 Spring 插件开发. 手动实现一个 IOC/DI 容器 上一篇文章里我们已经对 Spring 的源码有了一个大概的认识,对于 ...
随机推荐
- VSCode 修改终端显示字体 字体间隔过大
参考链接: https://code84.com/172442.html
- Jemeter 压测 Elasticsearch
Jemeter 版本 apache-jmeter-5.5 Elasticsearch 版本 7.17.6 自行官网下载 Elasticsearch压测报告 Elasticsearch 服务器当前情况: ...
- python 链表推导式x for xx in yy
一.(x for xx in yy )当x为固定参数 如: n = 10 # 生成n个0 matrix = [0 for i in range(n)]# 这里面0代表返回值,后面的for循环就是返回的 ...
- (已解决)nginx+php 上传文件大小设置。
1. 问题 上传文件过大报错,413 Request Entity Too Large. 2. 解决方法 修改配置文件,在以下两处: a. php.ini文件(php目录) 在File Uploads ...
- js格式转化
js对象转json数据(json字符串): let obj = {'name': '张三','age': 18} let data = JSON.stringify(obj); conlose.log ...
- python的开发工具pycharm的安装
如何下载 如何安装 如何配置环境 (mac和win版本) Pycharm的安装与配置以及汉化 一.pycharm的安装与配置(一定要去pycharm的官网去下载哦!) 1.最受欢迎的开发工具pycha ...
- potoshop制作一寸照片
potoshop制作一寸照片 经常因为各种原因需要提供1寸照片,第一反应应还是跑照相馆专业.但是疫情封闭在家怎么高,刚好把偶尔使用一次的potoshop用起来,解决照片制作问题,一来能省几毛钱买茶叶蛋 ...
- uniapp 样式记录
flex https://uniapp.dcloud.io/nvue-css display: flex;/* 容器布局 */ flex:1; overflow: scroll;/* 容器内滚动条 * ...
- ideavimrc 示例
我自己的idea vim配置,用熟悉了以后还真的挺方便的 比较常用的有 ManageRecentProjects,快速切换多个project,经常会遇到同时打开多个project,来回切换方便多了 H ...
- 【小记】如果 golang 内存不够了怎么办
在看 redis 1.0 源码时,总会看到需要申请内存的地方,如果申请不到需要大的内存就会返回 NULL,然后在调用层抛出 oom. 比如 listDup 中在复制特殊 value 或者加入新节点时都 ...