自己实现spring IOC框架(超详细)

1.IOC简介:

  控制反转即IoC (Inversion of Control),所谓控制反转就是应用本身不负责依赖对象的创建及对象之间关系的维护,而是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。

  IoC是一个很大的概念,可以用不同的方式来实现。例如:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。<2>依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型。

2.自己实现IOC

整体框架:

首先需要读取配置文件:注意这里的配置文件没有schema.

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans>
 3     <!-- 将A配置到配置文件中 -->
 4     <bean id="A" class="cn.itcast.bean.A">
 5         <!-- 配置A的属性,Spring会自动将A的属性值注入 -->
 6         <property name="name" value="tom"/>
 7     </bean>
 8     <bean id="B" class="cn.itcast.bean.B">
 9         <!--ref表示要讲Bean A注入  -->
10         <property name="a" ref="A"></property>
11     </bean>
12 </beans>

Java是面向对象的语言,读取配置文件时我们需要Java Bean来封装这些信息。

 1 public class Bean {
 2     /**
 3      * 封装
 4      * <bean id="A" class="cn.itcast.bean.A">
 5      * ....若干个<property>
 6      * </bean>
 7      */
 8     private String id;
 9
10     private String className;
11
12     private List<Property> properties = new ArrayList<Property>();
13
14     //setter.getter......
15
16     @Override
17     public String toString() {
18         return "Bean [id=" + id + ", className=" + className + ", properties="
19                 + properties + "]";
20     }
21
22 }
 1 public class Property {
 2     /**
 3      * 封装<property>
 4      * <property name="name" value="tom"/>
 5      * <property name="a" ref="A"></property>
 6      */
 7     private String name;
 8
 9     private String value;
10
11     private String ref;
12
13     //setter.getter......
14     @Override
15     public String toString() {
16         return "Property [name=" + name + ", value=" + value + ", ref=" + ref
17                 + "]";
18     }
19
20
21 }

至此,用于封装配置文件中的信息的类已经写好了。下面就需要创建解析XML文件的类

 1 public class ConfigManager {
 2
 3     //读取配置文件,返回读取结果。
 4     public static Map<String,Bean> getConfig(String path){
 5         //创建一个用于返回的Map对象
 6         Map<String,Bean> map = new HashMap<String,Bean>();
 7         //dom4j实现
 8             //1.创建解析器
 9             SAXReader reader = new SAXReader();
10             //2,加载配置文件=>document元素
11             InputStream is = ConfigManager.class.getResourceAsStream(path);
12             Document doc = null;
13             try {
14                 doc = reader.read(is);
15             } catch (DocumentException e) {
16                 e.printStackTrace();
17                 throw new RuntimeException("请检查您的xml配置文件是否正确!");
18             }
19             //3.定义xpath表达式,获取所有bean元素()
20             //从整个文档查找bean元素
21             String xpath = "//bean";
22             //4.对bean元素进行遍历
23             List<Element> list = doc.selectNodes(xpath);
24             if(list!=null&&list.size()>0){
25                 for(Element beanEle:list){
26                     Bean bean = new Bean();
27                     //把bean元素的id/class属性封装到Bean对象中
28                     String id = beanEle.attributeValue("id");
29                     String className = beanEle.attributeValue("class");
30                     bean.setId(id);
31                     bean.setClassName(className);
32                     //获取bean元素下的所有property子元素,把属性name/value/ref封装到Property对象中。
33                     List<Element> children = beanEle.elements("property");
34                     if(children!=null){
35                         for(Element child : children){
36                             Property prop = new Property();
37                             String pName = child.attributeValue("name");
38                             String pValue = child.attributeValue("value");
39                             String pRef = child.attributeValue("ref");
40                             prop.setName(pName);
41                             prop.setValue(pValue);
42                             prop.setRef(pRef);
43                             //把Property对象封装到Bean对象中
44                             bean.getProperties().add(prop);
45                         }
46                     }
47                     //把Bean对象封装到Map中(用户返回的Map)
48                     map.put(id, bean);
49                 }
50             }
51             //5.返回Map结果
52             return map;
53     }
54 }
时间: 2024-10-07 11:53:45

自己实现spring IOC框架(超详细)的相关文章

struts2+spring+mybatis框架整合详细介绍

一.问题的提出 最近一直在看各种主流javaweb框架,感触颇深,一个好的框架可以让你的程序代码变得相当的明了,也便于后期的维护!目前用到的主流框架包括struts2+spring+mybatis和spring+springmvc+mybatis(注:个人觉得mybatis框架很好用,所以框架基本都会选择用mybatis).其实很多的小伙伴都想自己配置个框架,但是基于怕报错啊.引入jar包.程序调试啊等等问题都放弃了!基于这个现象,本人在这里就详细的介绍下本人配置框架的详细过程,希望对读者有所帮

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

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

手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)【转】

一. 框架详情 Spring 是一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的.Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益. 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. SpringMVC 属于SpringFrameWork的后续产品,分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行定制. MyBatis 是一个基于Ja

手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)

SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式,将整个系统划分为显示层.Controller层.Service层.Dao层四层,使用SpringMVC负责请求的转发和视图管理,Spring实现业务对象管理, MyBatis作为数据对象持久化引擎. 一. 框架详情 Spring 是一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的.Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何

Java Web框架——自己动手实现一个简化版的Spring IOC框架

一.序 只要是Java Web的开发者,相信没有不知道大名鼎鼎的Spring框架的.作为一个优秀的开源框架,Spring包含9大组件,如果想要通过源码去理解每一个组件,复杂度和所花费的时间都容易让人望而却步--笔者平时习惯阅读源码,但是在学习Spring这种级别的框架面前显然不是一个好选择.但是问题又来了,不阅读源码,如何深入理解Spring呢?笔者在搜索学习资料的时候在github找到了一个优秀的repo--https://github.com/code4craft/tiny-spring,通

轻松理解spring IOC

spring IOC(Inversion of control)即控制反转 概念:一,spring框架的核心之一 二,控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 接下来我们以一个数据库连接的案列来阐述IOC的工作原理,下图为该项目的结构体系 本例中我们着重关注util(获取数据库连接对象)以及dao(数据库访问层)的依赖关系解析 本例需求:dao层可以自由,简洁操作mysql和sqlserver数据库 第一步:我们先定义了获取连接对象的接口 1 packa

Spring IOC 源码简单分析 01 - BeanFactory

### 准备 ## 目标 了解 Spring IOC 的基础流程 ## 相关资源 Offical Doc:http://docs.spring.io/spring/docs/4.3.9.RELEASE/spring-framework-reference/htmlsingle/ Sample code:<https://github.com/gordonklg/study>,spring module 源码版本:Spring framework 4.3.9 ##测试代码 gordon.stud

阿里P7给你一份超详细 Spring Boot 知识清单

在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Spring框架的应用,它是Spring对"约定优先于配置"理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于Spring生态圈的应用.那Spring Boot有何魔法?自动配置.起步依赖.Actuator.命令行界面(CLI) 是Spring Boot最重要的4大核心特性,其中CLI是

[Spring框架]Spring IOC的原理及详解。

这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后  受益匪浅,这里再重温一遍Spring IOC 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生