时间最近一段时期,“集装箱”这个词一直萦绕在我的耳边,连吃饭、睡在我的脑海里蹦来蹦去的。

由于这几天的交流时间、讨论,对于理解容器逐渐加深。

理论上的东西终归要落实到实践,今天就借助Spring容器实现原理,简单说说吧。

简单的说。Spring就是通过工厂+反射将我们的bean放到它的容器中的,当我们想用某个bean的时候,仅仅须要调用getBean("beanID")方法。

原理简介:

Spring容器的原理,事实上就是通过解析xml文件,或取到用户配置的bean,然后通过反射将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这些bean。以下是一段简单的模拟代码:

package com.tgb.spring.factory;

import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath; public class ClassPathXmlApplicationContext implements BeanFactory { //容器的核心,用来存放注入的Bean
private Map<String, Object> container = new HashMap<String, Object>(); //解析xml文件,通过反射将配置的bean放到container中
public ClassPathXmlApplicationContext(String fileName) throws Exception{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName));
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/beans/bean"); //扫描配置文件里的bean
for (int i = 0; i < list.size(); i++) {
Element bean = (Element) list.get(i);
String id = bean.getAttributeValue("id");
String clazz = bean.getAttributeValue("class");
Object o = Class.forName(clazz).newInstance();
container.put(id, o);
}
} @Override
public Object getBean(String id) {
return container.get(id);
} }

首先声明一个存放bean的Map。然后通过jdom解析配置文件,循环遍历全部的<bean>节点,并通过反射将它们放到我们之前声明的Map中。

然后提供一个getBean()的方法。让我们能够通过bean的Id来找到我们想要的bean。

以下是一个简单的xml配置文件:

<?xml version="1.0" encoding="UTF-8"?

>
<beans> <bean id="E" class="com.tgb.spring.factory.England" /> <bean id="S" class="com.tgb.spring.factory.Spain" /> <bean id="P" class="com.tgb.spring.factory.Portugal" /> </beans>

client通过调用前面的ClassPathXmlApplicationContext,来载入上面的配置文件。然后就能够通过Id来获得我们须要的bean了:

package com.tgb.spring.factory;

public class Test {

	public static void main(String[] args) throws Exception {

		//载入配置文件
BeanFactory f = new ClassPathXmlApplicationContext("applicationContext.xml"); //英格兰
Object oe = f.getBean("E");
Team e = (Team)oe;
e.say(); //西班牙
Object os = f.getBean("S");
Team s = (Team)os;
s.say(); //葡萄牙
Object op = f.getBean("P");
Team p = (Team)op;
p.say();
} }

输出结果:

England :我们是欧洲的中国队。不在乎这次小组没出线...
Spain :我们是两届欧洲杯冠军、一届世界杯冠军。
Portugal:我们的C罗一个顶十个!

其它代码:

//工厂接口
package com.tgb.spring.factory; public interface BeanFactory {
Object getBean(String id);
} //Team接口
package com.tgb.spring.factory; public interface Team {
void say();
} //英格兰
package com.tgb.spring.factory; public class England implements Team{ public void say() {
System.out.println("England:我们是欧洲的中国队,不在乎这次小组没出线...");
}
} //西班牙
package com.tgb.spring.factory; public class Spain implements Team{ @Override
public void say() {
System.out.println("Spain:我们是两届欧洲杯冠军、一届世界杯冠军。");
} } //葡萄牙
package com.tgb.spring.factory; public class Portugal implements Team { @Override
public void say() {
System.out.println("Portugal:我们的C罗一个顶十个。");
} }

以上内容是对Spring的一个简单模拟。当然Spring远比这个要复杂的多。也强大的多,并且获取bean的方式也不止通过工厂这一种。这里仅仅是做一个粗略的Demo说说自己对容器的简单理解,向Spring致敬。样例简陋。表达粗糙。欢迎拍砖交流。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

最佳新秀SSH(十三)——Spring集装箱IOC分析和简单的实现的更多相关文章

  1. 菜鸟学SSH(十三)——Spring容器IOC解析及简单实现

    最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助Sprin ...

  2. Spring的IOC分析(一)

    我们学习Spring之前需要对23种java的设计模式的9种有一定的理解,设计模式为了解耦,Spring也是在解耦的方向上设计的,所以设计模式要理解一下,它当中用到了很多. 单例模式(写法很多钟,7种 ...

  3. Spring的IOC分析(二)源码

    承接上节继续,分析Ioc的工作原理,在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起(同时一个叫DI"依赖注入"或DL"依赖查找" ...

  4. Spring框架-IOC和AOP简单总结

    参考博客: https://blog.csdn.net/qq_22583741/article/details/79589910 1.Spring框架是什么,为什么,怎么用 1.1 Spring框架是 ...

  5. Spring容器IOC解析及简单实现(转)

    文章转自http://blog.csdn.net/liushuijinger/article/details/35978965

  6. 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理

    之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...

  7. JAVA模拟Spring实现IoC过程(附源码)

    前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...

  8. 【spring源码分析】IOC容器初始化(总结)

    前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...

  9. 【spring源码分析】IOC容器初始化(一)

    前言:spring主要就是对bean进行管理,因此IOC容器的初始化过程非常重要,搞清楚其原理不管在实际生产或面试过程中都十分的有用.在[spring源码分析]准备工作中已经搭建好spring的环境, ...

随机推荐

  1. 20款Notepad++插件下载和介绍

    转自:http://www.kuqin.com/developtool/20090628/59334.html Notepad++从3.4版本开始支持插件机制,让用户可选择的为本身已经优秀的Notep ...

  2. 【HTTP】Fiddler(二) - 使用Fiddler做抓包分析

    上文( http://blog.csdn.net/ohmygirl/article/details/17846199 )中已经介绍了Fiddler的原理和软件界面.本文主要针对Fiddler的抓包处理 ...

  3. static在C和C++中的用法和区别

    static主要有三个作用: (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍: 一.局部静态变量 在C/C+ ...

  4. 基于visual Studio2013解决C语言竞赛题之1023判断排序

         题目 解决代码及点评 /* 23. 有10个两位整数,把这些数作以下变化,如果它是素数, 则把它乘以2,若它是偶数则除以2,其余的数减1, 请将变化后的10个数按从小到大 ...

  5. asp.net2.0安全性(4)--Login系列控件--转载来自车老师

    前面主要说了与安全相关的一系列的类,现在我们使用这些类就可以做出我们自己的安全系统了.其实微软的目的远不至于此,下面我们就来看一下微软为我们提供的Login系列控件. Login系列控件是微软为了简化 ...

  6. linux命令:echo

    echo $SHELL ----> /usr/bin/tcsh echo $ARBORDIR ----> /export/home/arbsfr/SFR_ENTREPRISE/SFRE3

  7. 更快地从IplImage转换成QImage

    转:http://blog.sina.com.cn/s/blog_5c70dfc80100qzif.html 在Qt平台上使用OpenCV肯定会遇到从IplImage到QImage的转换问题,找了很多 ...

  8. 奇葩的UI引用LayoutInflater.from问题

    今收到BUG一枚,一个页面的EditText的风格变为了系统默认(系统经过定制,风格和普通的不同) 经检查xml无任何不妥,最终问题出在LayoutInflater.from上. 如果LayoutIn ...

  9. .NET - 代码重构技巧

    通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然了,这也是从一个普通程序员到一个高级程序员的必由 ...

  10. JSP的学习(2)——语法知识一

    上一篇<JSP的学习>讲述了JSP的一些基础知识和底层原理,本篇将来学习JSP所需掌握的语法知识等. JSP的语法主要包括以下几个部分的内容: 1)         JSP模板元素 2)  ...