Spring Ioc 源码的初探
来源:互联网 发布:软件行业的外包 编辑:程序博客网 时间:2024/05/21 17:44
看ioc的源码已经好几天了,每天都会花一小时左右的时间去研究内部原理,但是一直都有困惑,后来看到一片博客是关于BeanFactory的,突然间感觉思路清晰很多。
下面是我收集的代码
spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后就会对spring的原理有一定的了解。
spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。
首先我们建立一个BeanFactory接口
package com.spring; public interface BeanFactory { Object getBean(String id);}
然后建立一个BeanFactory的实现类ClassPathXmlApplicationContext.java
package com.spring;import java.util.HashMap;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String, Object> beans = new HashMap<String, Object>(); public ClassPathXmlApplicationContext(String fileName) throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName)); List<Element> elements = document.selectNodes("/beans/bean"); for (Element e : elements) { String id = e.attributeValue("id"); String value = e.attributeValue("class"); Object o = Class.forName(value).newInstance(); beans.put(id, o); } } public Object getBean(String id) { return beans.get(id); }}
然后配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="c" class="com.spring.Car"></bean> <bean id="p" class="com.spring.Plane"></bean> </beans>
创建类的时候顺便演示一下工厂模式,其实BeanFactory它也是一种工厂模式的。
package com.spring; public interface Moveable { void run(); }
package com.spring;public class Car implements Moveable{ public void run(){ System.out.println("拖着四个轮子满街跑car·····"); }}
package com.spring;public class Car implements Moveable{ public void run(){ System.out.println("拖着四个轮子满街跑car·····"); }}
测试一下
package com.spring;import org.dom4j.DocumentException;public class Test { /** * @param args * @throws DocumentException */ public static void main(String[] args) throws Exception { BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); Object o = factory.getBean("c"); Moveable m = (Moveable)o; m.run(); }
由于Map容器里面保存的是Object类型,所以通过getBean()方法取出来的对象要强制类型转换。
0 0
- Spring Ioc 源码的初探
- spring源码学习之路---IOC初探
- Spring IOC源码 个人初探(一) BeanFactory
- spring源码学习之路---IOC初探(二)
- spring源码学习之路---IOC初探(二)
- spring源码学习之路---IOC初探(二)
- spring源码学习之路---IOC初探(一)
- 初探spring之IoC实现
- Spring.net----初探IOC容器
- Spring源码学习IOC(5):IOC容器的依赖注入
- Spring源码学习IOC(6):IoC容器的高级特性
- spring源码分析--------ioc的架构设计
- 【Spring源码--IOC容器的实现】-- 综述
- Spring IOC 源码分析:容器的启动
- 【Spring源码--IOC容器的实现】-- 综述
- IOC、Spring的IOC
- Spring IOC源码分析
- spring ioc 源码解析
- CodeForces - 687A (连通图染色)
- 磁盘I/O
- append("A").append("B").append("C")和append("ABC")
- linux目录结构
- 用Awstats工具来分析httpd和tomcat的访问日志
- Spring Ioc 源码的初探
- 微积分公理化,赶超美日不难
- 关于static的一些理解
- 【Leetcode】290. Word Pattern
- JS核心
- Eclipse开启弹出"Subversive Connector Discovery"窗口解决办法
- OpenDDS开发手册---第一章
- Java多线程问题 Top 50
- 蓝桥杯 ALGO-155 算法训练 C++ CH08 01