spring ioc原理分析
spring ioc原理分析
- spring ioc 的概念
- 简单工厂方法
- spirng ioc实现原理
spring ioc的概念
ioc: 控制反转 将对象的创建由spring管理。比如,我们以前用new一个对象的方式自己创建一个对象,现在使用spring,不必自己new一个对象了,而是使用了另一种方式。
spring ioc 入门
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloService" class="demo1.HelloServiceImpl"></bean>
</beans>
HelloService.java
public interface HelloService {void sayHello();
}
HelloServiceImpl.java
public class HelloServiceImpl implements HelloService {private String info;public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}public void sayHello() {System.out.println("hello--" + info);}
}
使用spring创建对象
@Test// Spring开发public void demo2() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");HelloService helloService = (HelloService)applicationContext.getBean("helloService");helloService.sayHello();}
简单工厂方法
要想理解spring ioc的原理,必选要知道简单工厂方法
下面介绍简单工厂方法
简单工厂模式是一种创建模式,创建模式是帮助我们更好地组织创建对象的代码,适应不同情况下的创建和初始化对象。
简单工厂方法的结构
举例
以上面的为例:
HelloService为抽象产品
HelloServiceImpl为具体产品
我们再写一个具体产品:
HelloServiceImpl2
public class HelloServiceImpl2 implements HelloService {public void sayHello() {System.out.println("hello-- HelloServiceImpl2");}
}
对于HelloService,我们以前的客户端调用是这样的:
@Test// 传统方式public void demo1() {// 造成程序紧密耦合.HelloService helloService = new HelloServiceImpl();helloService.sayHello();HelloService helloService2 = new HelloServiceImpl();helloService2.sayHello();}
我们是用new的方式创建一个对象,那如何用工厂方法创建对象?
首先,我们得有一个创建Bean的工厂类
BeanFactory //简单工厂
public class BeanFactory{public Object getHelloService(String beanName){if(beanName.equals("HelloService1")){return new HelloServiceImpl();} else if (beanName.equals("HelloService2")){return new HelloServiceImpl2();} else {return null;}}
}
这样,我们以后想获得HelloService就可以这样:
// 客户端调用
BeanFactory beanFactory = new BeanFactory();
HelloService helloService = (HelloService)beanFactory.getHelloService("HelloService1");
spirng ioc实现原理
spring ioc的实现原理,实际上就是简单工厂+sax解析xml+反射获取类对象
对于BeanFactory中,我们如下做:
public class BeanFactory{public Object getBean(String beanName){// 反射 + 解析配置文件return Class.forName("类名").new Instance();}
}
通过id,我们通过解析spring配置文件解析到id所对应的类,然后获取全名,通过反射创建类。这样,我们想获得bean,不需要修改代码,只需要新增类,然后再在配置文件中配置一下。
相关文章:

PL/SQL集合类型的整理学习
http://log-cd.iteye.com/blog/521177 PL/SQL集合类型是类似于高级语言数组的一种复合数据类型,集合类型包括索引表(PL/SQL表)、嵌套表(Nested Table)和变长数组(VARRAY)三种类型。<一>、…

多条件组合查询+分页
比较麻烦,把他记录下来。前台UI:实现的类代码:程序代码/// <summary>/// 多条件组合查询/// </summary>/// <param name"suppliercode">供应商代码</param>/// <param name"materialcode">物料代码&l…
Matlab与线性代数 -- 矩阵的重组1
本图文介绍了矩阵重组的第一种情况用新的行或列取代原有矩阵的行或列。

工作中感受到的消息中间件在分布式系统中的使用场景
经历 以前在qunar实习,第一次接触消息中间件,那时候概念还不清楚,朦朦胧胧有个初步认识,现在正式工作了,又一次接触了消息中间件,初步总结几种场景。 场景 1.分布式系统中,不同系统之间传递消…

sql server 2005分页存储过程和sql server 2000分页存储过程(摘)
USE[svnhost]GO/****** 对象: StoredProcedure [dbo].[up_Page2005] 脚本日期: 05/21/2008 11:27:05 ******/SETANSI_NULLS ONGOSETQUOTED_IDENTIFIER ONGOCREATEproc[dbo].[up_Page2005]TableNamevarchar(50), --表名Fieldsvarchar(5000) *, --字段名(全部字段为…

topcoder srm 691 div1 -3
1、给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$。增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x})$,增加边$(x,n)$。最后使得顶点0和1相连。有多少种$M$? 思路&#…
Matlab与线性代数 -- 矩阵的重组2
本图文详细介绍了矩阵重组的第二种情况任意两行或两列进行对换。

mac通过tree源码编译安装tree
通过tree源码编译安装 下载源码:curl -O ftp://mama.indstate.edu/linux/tree/tree-1.6.0.tgz 解压源码:tar xzvf tree-1.6.0.tgz 修改Makefile文件: tree默认的是linux的编译环境,因此移植到mac里面需要注释掉linux的编译选项&am…

java IO流文件的读写具体实例
IO流的分类:1、根据流的数据对象来分:高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,OutputStream 如何区分…
Matlab与线性代数 -- 矩阵的重组3
本图文详细介绍了矩阵重组的第三种情况,从矩阵中选取子矩阵。

ASP.NET小收集:IFrame使用
使用Iframe制作一个固定框架,很方便与象后台网站之类的页面1<html xmlns"http://www.w3.org/1999/xhtml">2<head runat"server">3<title>后台</title>4</head>5<frameset cols"170,*"framespacing&…

linux mac中实现类似secureCRT的clone session
在你的登录账户下的.ssh文件夹新建一个文件:config. cd ~/.ssh vi config config的文件中,内容为: host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p 重新打开终端,第一次,你还是需要输入密码,…

C#动态加载DLL(转)
利用反射进行动态加载和调用.Assembly assAssembly.LoadFrom(DllPath); //利用dll的路径加载加载dll后,需要使用dll中某类.Type typeass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略…

mysql高可用之MMM
博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!一、MMM简介:MMM即Multi-MasterReplication Manager for MySQL:mysql多主复制管理器。M…
Matlab与线性代数 -- 矩阵的重组4
本图文详细描述了矩阵重组的第四种情况,将矩阵改写成行向量或者列向量。

利用spring aop统一处理异常和打日志
利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用。 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger.warn(),logger.error()的代码,这样一个方法本来的业务逻辑只有5行&a…
Matlab与线性代数 -- 矩阵的重组5
本图文详细介绍了矩阵重组的Matlab命令reshape()。
windows XP下Python2.7包管理工具安装-setuptool,pip、distribute、nose、virtualenv
在Python开发中为了对项目进行管理和调试。必须安装一些特定的软件包。据说业内这个叫做yak shaving-做一个非常酷非常绚丽的Python项目之前,必须做的一些枯燥无味的准备工作。本文介绍了setuptool。pip、distribute、nose、virtualenv的安装。 1,pytho…

黑客必知的SQL语句 黑客知道,程序员必知
SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 一、基础 1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --…

AutowireCapableBeanFactory,实现不必配置xml文件,动态加载bean
场景 今天遇见一个问题,如何能做到一个类,没有在spring的配置文件中配置,但是还能通过某种方式加载进来。通过查看一些代码,查看stackoverflow,了解了一些知识。 如果一个类并没有在applicationContext中配置我们可以…
[导入]如何理解Return的返回值?
如何理解Return的返回值? 问题: 在创建和录制脚本的时候,发现在脚本vuser_init、Action、vuser_end三部分,都会有一条“return 0;”语句,那么我们平时在编写脚本时如何应用return语句,return不同的返回值又…
如何利用神经网络结合遗传算法进行非线性函数极值寻优(2)
如何利用神经网络结合遗传算法进行非线性函数极值寻优

自己亲自写的两本linux资料,免费下载,pdf文档
第一本是我写的韩顺平老师解说的linux视频的笔记,该视频原本有21讲,可是我始终没有找到当中的17、18讲。可是其它部分我感觉及记录的还是蛮认真的。该套视频解说的非常基础,因此我的这本笔记也非常基础。这里是免积分在csdn上的下载地址&…

深入理解Java:SimpleDateFormat安全的时间格式化
转自:http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html 想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以…

如何提高增加包含大量记录的表的主键字段的效率
如何提高增加包含大量记录的表的主键字段的效率 LazyBee 1 问题的提出: 在给客户升级数据库系统时,由于报表的需要,系统中每一个表都需要有主键字段。系统审计表自然也有这个要求—需要增加一个identify的字段,但这个表中有2000多…

${pageContext.request.contextPath} JSP取得绝对路径
在使用的时候可以使用${pageContext.request.contextPath},也同时可以使用<%request.getContextPath()%>达到同样的效果,同时,也可以将${pageContext.request.contextPath},放入一个JSP文件中,将用C:…
Matlab与线性代数 -- 矩阵的水平连接和垂直连接
本图文详细介绍了Matlab中矩阵的水平连接和垂直连接。
Matlab与线性代数 -- 矩阵的复制
本图文详细介绍了Matlab中矩阵复制函数repmat(A,m,n)。

用C#实现抽象工厂模式
大家都知道,在开发中,如果用好了某种模式,那效率…… 嘿嘿 我就不说了 进入正题吧: 以下都为源代码,可直接拷贝,然后自己研究 由于是讲解,所以只涉及基本的架构 项目名为:Ab…

树莓派 raspberry安全关机命令重启命令
树莓派可以通过下面几个命令来实现安全关机:sudo shutdown -h now sudo halt sudo poweroff sudo init 0上面四行代码都可以,执行一行都可以安全关机, ^_^树莓派重启 定时重启方法:sudo reboot shutdown -r now shutdown -r 04:00:00 #定时重…