spring容器IOC原理解析
原理简单介绍:
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>
客户端通过调用前面的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致敬。例子简陋,表达粗糙,欢迎拍砖交流。
spring容器IOC原理解析的更多相关文章
- 菜鸟学SSH(十三)——Spring容器IOC解析及简单实现
最近一段时间,“容器”两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助Sprin ...
- Spring Boot启动原理解析
Spring Boot启动原理解析http://www.cnblogs.com/moonandstar08/p/6550758.html 前言 前面几章我们见识了SpringBoot为我们做的自动配置 ...
- Spring的IOC原理[通俗解释一下]
Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...
- 【死磕 Spring】----- IOC 之解析 bean 标签:开启解析进程
原文出自:http://cmsblogs.com import 标签解析完毕了,再看 Spring 中最复杂也是最重要的标签 bean 标签的解析过程. 在方法 parseDefaultElement ...
- 从头看看Tomcat启动Spring容器的原理
通过带注解Spring Boot可以启动一个web容器,并初始化bean容器.那么Tomcat启动并初始化spring容器的原理是怎样的? Tomcat启动web程序时会创建一对父子容器(图1): 有 ...
- Spring之IOC原理及代码详解
一.什么是IOC 引用 Spring 官方原文:This chapter covers the Spring Framework implementation of the Inversion of ...
- 死磕Spring之IoC篇 - 解析自定义标签(XML 文件)
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- spring容器IOC创建对象<三>
问题?Spring的DI讲解.DI有几种注入方式.一.spring的DI:依赖注入给属性赋值DI定义:一个对象类的属性可以使用springDI(依赖注入)来进行赋值,但是并不是所有的类属性都适合spr ...
- spring容器IOC创建对象<二>
问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...
随机推荐
- IE常见的CSS的BUG(一)
2011年6月,我毕业了.2012年我接触了CSS,本以为会好过些能赚点钱了,可谁知,Internet Explorer(下称IE),这个前端工程师的噩梦浏览器让我不再那么好过了.各种出现在IE身上的 ...
- Android 通知栏用法例子
当程序意外退出时,可以去掉通知栏上显示的图标 1.创建TestNotificationActivity activity类, package com.notioni.test.notification ...
- C# winform带进度条的图片下载
代码如下: public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void ...
- RMAN-configure命令
在Oracle 10g中的配置情况 使用RMAN>show all; 可以显示出RMAN 配置参数为: CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # ...
- 【Solr初探】Solr安装,启动,查询,索引
1. 安装&启动 官网:http://lucene.apache.org/solr/ 下载源代码,解压,进入根目录(我把solr放在/usr/local/solr下) 在/usr/local/ ...
- poj3264 线段树
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 44121 Accepted: 20715 ...
- JDK+Eclipse+MyEclipse+tomcat的安装与配置
以下我所使用的各软件版本为:JDK(1.6):eclipse(3.2.2):myEclipse(5.5.1GA):tomcat(5.5.12): 一.安装JDK: 下载完JDK(1.6)后双击进行安装 ...
- dwz笔记之tree权限扩展
碰到的问题:tree选择子节点时,父级节点的值没有选择 解决方法如下(红色部分): 原代码: _checkParent:function(){ if($(this).parent().hasClass ...
- irms模拟数据生成及数据分析
一.数据准备 1.每天生成随机一个文本,每小时向文本中追加2次数据,每次10万条 随机数据生成: 2,32 * * * * bash /mnt/jediael/irms/signalGenerat ...
- 搬寝室(HDU 1421 DP)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...