最佳新秀SSH(十三)——Spring集装箱IOC分析和简单的实现
时间最近一段时期,“集装箱”这个词一直萦绕在我的耳边,连吃饭、睡在我的脑海里蹦来蹦去的。
由于这几天的交流时间、讨论,对于理解容器逐渐加深。
理论上的东西终归要落实到实践,今天就借助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分析和简单的实现的更多相关文章
- 菜鸟学SSH(十三)——Spring容器IOC解析及简单实现
最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助Sprin ...
- Spring的IOC分析(一)
我们学习Spring之前需要对23种java的设计模式的9种有一定的理解,设计模式为了解耦,Spring也是在解耦的方向上设计的,所以设计模式要理解一下,它当中用到了很多. 单例模式(写法很多钟,7种 ...
- Spring的IOC分析(二)源码
承接上节继续,分析Ioc的工作原理,在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起(同时一个叫DI"依赖注入"或DL"依赖查找" ...
- Spring框架-IOC和AOP简单总结
参考博客: https://blog.csdn.net/qq_22583741/article/details/79589910 1.Spring框架是什么,为什么,怎么用 1.1 Spring框架是 ...
- Spring容器IOC解析及简单实现(转)
文章转自http://blog.csdn.net/liushuijinger/article/details/35978965
- 新秀学习SSH(十四)——Spring集装箱AOP其原理——动态代理
之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到 ...
- JAVA模拟Spring实现IoC过程(附源码)
前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...
- 【spring源码分析】IOC容器初始化(总结)
前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...
- 【spring源码分析】IOC容器初始化(一)
前言:spring主要就是对bean进行管理,因此IOC容器的初始化过程非常重要,搞清楚其原理不管在实际生产或面试过程中都十分的有用.在[spring源码分析]准备工作中已经搭建好spring的环境, ...
随机推荐
- GAE+bottle+jinja2+beaker快速开发demo - Python,GAE - language - ITeye论坛
GAE+bottle+jinja2+beaker快速开发demo - Python,GAE - language - ITeye论坛 :GAE+bottle+jinja2+beaker快速开发 ...
- Mac 实用工具
命令行常用工具: Iterm2 也是一个终端命令行工具,支持多工作区,使用清爽 http://www.iterm2.com/documentation.html 给你的命令行 代码上色 Solariz ...
- JS 数组获取最大值
一.一维数组 var a=[1,2,3,5]; alert(Math.max.apply(null, a));//最大值 alert(Math.min.apply(null, a));//最小值 二. ...
- 大容量XFS异常处理
今天在检查报警的时候发现部分数据异常,登陆备份机查看文件状态的时候发现磁盘空间已经满了,inode也已经有问题了,因此先停掉了所有的备份进程,开始检查问题. 首先是磁盘空间满了,尝试删除部分文件,发现 ...
- Nginx 负载均衡配置和策略
Nginx 的 HttpUpstreamModule 提供对后端(backend)server的简单负载均衡.一个最简单的 upstream 写法例如以下: upstream backend { se ...
- 如何将自定义标签封装成一个Jar包
当我们在一个web应用中开发好一些自定义标签的时候,这些自定义标签通常有标签处理器Java类,和一个描述这些标签tld文件,如果我们想在以后别的web工程中还能用上这些标签,可以将这些自定义标签封装在 ...
- c# 使用OracleParameter,同时使用replace函数
也算不上是手误吧,这个问题竟然困扰了我那么多天,就是更新代码的时候,使用replace,但是oracle在.net下竟然是不支持汉字,所谓使用类似update x set y='m' where y= ...
- treeview树形菜单,递归
我使用的是递归是实现无限级树形菜单: using System; using System.Collections; using System.Configuration; using System. ...
- unity3d游戏开发学习之使用3dmax创建导弹模型
在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d ...
- 百度地图js版定位控件
一 概述 百度地图在最新版已加入浏览器定位控件,个人认为应该是既高德地图更新了一个浏览器也能定位功能后,百度不甘落后自己简简单单,草草写了个这个功能的定位控件 GeolocationControl 这 ...