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定义:把对象的创 ...
随机推荐
- linux下单独安装oracle12.1客户端
1.安装oracle-instantclient:(默认安装即可) oracle-instantclient12.1-sqlplus-12.1.0.1.0-1.x86_64.rpmoracle-ins ...
- windows常用net use命令
net share :查看本地主机的共资源 nbtstat -A IP :得到远程主机的用户列表 net user c:/del 删除映射的C盘,其它盘类推 net user * /del 删除全部映 ...
- 用CSS3写的钟表
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- java.sql.SQLException: ORA-00911: 无效字符 解决方案
在使用java执行sql时,抛出的这样一个Oracle异常,最后发现是sql语句末尾有一个分号导致,例如:sql="select * from tl_demo;" .删除" ...
- SqlDbType与DbType这间的转换关系
SqlDbType => DbType SqlDbType.BigInt DbType.Int64 SqlDbType.Binary DbType.Binary SqlDbType.Bit Db ...
- 数据库分库分表(sharding)系列(一)拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- textField:shouldChangeCharactersInRange:replacementString:
http://blog.csdn.net/mamong/article/details/44964801
- SQL 标准中的四种隔离级别
READ UNCOMMITED(未提交读) 在RERAD UNCOMMITED级别,事务中的修改,即使没有提交,对其他事务也都是可见的.事务可以读取未提交的数据,这也成为脏读(Dirty Read). ...
- 【0】Laravel 5.1 简介
1.简介 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以 ...
- C# winform 窗体弹出选择目录或文件 的对话框
//弹出一个选择目录的对话框 privatevoid btnSelectPath_Click(object sender, EventArgs e) //弹出一个选择目录的对话框 { FolderBr ...