手写一个IOC容器

链接:https://pan.baidu.com/s/1MhKJYamBY1ejjjhz3BKoWQ
提取码:e8on

明白什么是IOC容器:

IOC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

传统的java代码中,我们需要使用哪个对象,就new一个对象,很正常对吧?

然而,这时出现了一个新思想:IOC(控制反转)

由它创建和管理所有的对象,我们需要的时候,只需要拿就可以了。这种思想的产生,主要是为了解耦。在软件工程中,我们常常要求设计出高内聚,低耦合的软件。这种思想显然是符合这一点的。

首先创建一个java web项目

文件目录如下:

由于是使用IOC容器,所以我们需要手写application.xml文件,并解析其中的<bean>标签来创建相应的对象

application.xml文件内容如下:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <beans>
3     <bean class="top.bigking.service.HelloService" id="helloService" />
4 </beans>

可以看到,只有一个id为helloService的bean

由于要解析xml文件,所以我们需要添加dom4j.jar包

接下来我们开始写BigKingApplicationContext.java 来解析xml文件

抽出其中比较重要的一段代码:

 1     private void parseApplication(){
 2         URL url = this.getClass().getClassLoader().getResource(this.applocationConfigURL);
 3         if(url == null) {
 4             System.out.println("资源不存在!");
 5             return;
 6         }
 7         SAXReader reader = new SAXReader();
 8         try {
 9             Document document = reader.read(url);
10             List<Element> elementList = document.selectNodes("/beans/bean");
11             elementList.forEach(element -> {
12                 String id = element.attributeValue("id");
13                 String clazz = element.attributeValue("class");
14                 BigKingBean bigKingBean = new BigKingBean(id, clazz);
15                 bigKingBeanList.add(bigKingBean);
16             });
17
18         } catch (DocumentException e) {
19             e.printStackTrace();
20         }
21     }

可以看到,我们使用dom4j解析了xml文件,获取了helloService这个bean的相关信息

并且通过一个BigKingBean类来new了一个对象,通过这个Bean类,我们就可以把application.xml中写的所有bean对象全部new出来

那么我们继续回到IOC(控制反转)的概念

IOC容器的作用是创建和管理对象,我们现在实现了创建,怎么管理呢?

我们引入IOC容器的概念,目的就是为了方便管理。当我们需要的时候,直接拿来用就可以了,所以,我们应该提供一个根据id取对象的方法,为了实现这个目的,我们需要在BigKingApplicationContext这个解析类中增加一个map集合,key是对象id,值是对象(并且是Object类型)

这一部分的关键代码为:

 1     private void generatorBean(){
 2         if(CollectionUtils.isEmpty(bigKingBeanList)) return;
 3         bigKingBeanList.forEach(bigKingBean -> {
 4             try {
 5                 map.put(bigKingBean.getId(), Class.forName(bigKingBean.getClazz()).newInstance());
 6             } catch (InstantiationException e) {
 7                 e.printStackTrace();
 8             } catch (IllegalAccessException e) {
 9                 e.printStackTrace();
10             } catch (ClassNotFoundException e) {
11                 e.printStackTrace();
12             }
13         });
14     }
15     @Override
16     public Object getBeans(String id){
17         return map.get(id);
18     }

原文地址:https://www.cnblogs.com/ABKing/p/12018182.html

时间: 2024-08-03 19:25:08

手写一个IOC容器的相关文章

放弃antd table,基于React手写一个虚拟滚动的表格

缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反而有所上升. 客观地说,antd是开源的,UI设计得比较美观(甩出其他组件库一条街),而且是蚂蚁金服的体验技术部(一堆p7,p8,p9,基本都是大牛级的)在持续地开发维护,质量可以信任. 不过,antd虽好,但一些组件在某一些场景下,是很不适用的.例如,以表格形式无限滚动地展示大量数据(1w+)时,

Spring.Net学习笔记二(自己用工厂的方式搭建一个IOC容器)

第一篇文章大致能跑起来一个基于Spring.Net程序,现在这篇主要的是介绍自己如何搭建一个IOC容器,以便更好的理解和掌握IOC. 第一步:用字典模拟IOC容器. 1 public class IOCFactory 2 { 3 private IDictionary<string, object> IocDict = new Dictionary<string, object>(); 4 public IOCFactory(string fileName) 5 { 6 XElem

利用SpringBoot+Logback手写一个简单的链路追踪

目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简单的链路追踪,下面详细介绍下. 一.实现原理 Spring Boot默认使用LogBack日志系统,并且已经引入了相关的jar包,所以我们无需任何配置便可以使用LogBack打印日志. MDC(Mapped Diagnostic Context,映射调试上下文)是log4j和logback提供的一种

手写一个模块化的 TCP 服务端客户端

前面的博客 基于 socket 手写一个 TCP 服务端及客户端 写过一个简单的 TCP 服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对 socket 编程的认识. 这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”. 对于 Socket 编程这类所需知识偏底层的情况(OS 协议栈的运作机制,TCP 协议的理解,多线程的理解,BIO/NIO 的理解,阻塞函数的运作原理甚至是更底层处理器的中断.网卡等外设与内核的交互.核心态与内核态的切

Spring系列之手写一个SpringMVC

目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AOP的原理及手动实现 Spring系列之手写注解与配置文件的解析 引言 在前面的几个章节中我们已经简单的完成了一个简易版的spring,已经包括容器,依赖注入,AOP和配置文件解析等功能.这一节我们来实现一个自己的springMvc. 关于MVC/SpringMVC springMvc是一个基于mvc模式的web框架,SpringMVC框架是一种提供了MVC(模型 - 视图 - 控制器)架

css手写一个表头固定

Bootstrap,layui等前端框架里面都对表头固定,表格滚动有实现,偏偏刚入职的公司选择了手动渲染表格,后期又觉得表格数据拉太长想要做表头固定.为了避免对代码改动太大,所以决定手写表头固定 主要遇到的个问题就是固定以后数据表格与表头的对齐问题,也看了很多我文章试下来都不怎么成功,只好自己一点点试 表头固定的一般思路是布两个table,一个放表头,一个放表格体,然后将表格体加上高度height以及overflow-y <div class="content"> <

从零开始手写 spring ioc 框架,深入学习 spring 源码

IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 但是 spring 源码存在一个问题,那就是过于抽象,导致学习起来成本上升. 所以本项目由渐入深,只实现 spring 的核心功能,便于自己和他人学习 spring 的核心原理. spring 的核心 Spring 的核心就是 spring-beans,后面的一切 spring-boot,spr

手写一个词法分析器

前言 最近大部分时间都在撸 Python,其中也会涉及到将数据库表转换为 Python 中 ORM 框架的 Model,但我们并没有找到一个合适的工具来做这个意义不大的"体力活",所以每次新建表后大家都是根据自己的表结构手写一遍 Model. 一两张表还好,一旦 10 几张表都要写一遍时那痛苦只有自己知道:这时程序员的 slogan 再次印证:一切毫无意义的体力劳动终将被计算机取代. intellij plugin 既然没有现成的工具那就自己写一个吧,演示效果如下: 考虑到我们主要是用

爬虫入门 手写一个Java爬虫

本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做什么的?  他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径, 然后继续访问,继续解析;继续查找需要的数据和继续解析出新的URL路径  . 这就是网络爬虫主要干的工作.  下面是流程图: 通过上面的流程图