白话Spring(基础篇)---IOC

来源:互联网 发布:windows监控工具 编辑:程序博客网 时间:2024/05/19 00:08

[一知半解,就是给自己挖坑]

Spring的IOC(Inversion of Control,控制反转)是一个非常重要的概念,但是,对于初学者的看过的大多数资料要么解释的讳莫如深,要么看完不知所云。接下来,我们先举一个实际的例子来类比程序中的IOC概念。另外,我们这里仅仅介绍概念及使用。对于Spring源码的解读,将会在高级篇中进行介绍,敬请期待!

准备工作:

a.操作系统:win7 x64

b.开发工具:eclipse mars j2ee版本,maven3.3.2,Spring 4

-----------------------------------------序言---------------------------------------------------------------------------------------------------------

我们先以自由恋爱和包办婚姻来举个例子吧!

假设:有一个男孩叫小明,有一个事件叫结婚,有多个女孩分别叫小美,小丽等。

在自由恋爱时,即当没有使用控制反转时:小明与女孩结婚。那么小明首先需要寻找一个合适的对象,再针对这个对象进行各种形式的追求,最后才能结婚。结婚这个动作从开始到结束一直"强制"的绑定了双方,在代码中是一种紧耦合的表现。在这个过程里,小明为了结婚,付出了很大的“牺牲”,如果运气不好,再来一次的话,那么从寻找对象到结婚这个动作又必须重来。

在包办婚姻情况下,即当使用控制反转时:小明想要结婚,那么Spring在结婚双方之间就像是婚介所(也可以换成父母),它管理所有女孩的信息,小明只要说:我想找个上得厅堂,下得厨房的妹子,那么婚介所从这么多女孩中寻找到符合要求的人提供给小明,他们直接结婚即可。如果小明在结婚时问“是否愿意嫁给我”女孩回答“不愿意”的话,那么程序直接就报错。因此,小明可以看作是一直“站在民政局门口”,只要成功的取得一个对象,那么马上就能完成“结婚”这个动作。

我们古人是多么智慧!多么先进!

------------------------------------------------------------------------------------------------------------------------------------------------------

正文开始:

一.我们先来看看“自由恋爱”情况下的“结婚动作”发生的全过程

1.1.以maven创建Spring02工程,创建步骤请参考:Maven简明教程(3)---在eclipse中创建工程与基本命令介绍,创建成功之后工程结构图如下所示:


1.2.pom文件的内容请参考前文helloworld,这里不在赘述。

1.3.创建Boy.java,具体内容如下:

package com.java.ingo.boy;import com.java.ingo.service.GetMarried;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午8:47:57*类说明*/public class Boy {public static void main(String[] args) {GetMarried getMarried = new GetMarried();getMarried.getMarried();}}
1.4.创建GetMarried.java,具体package com.java.ingo.service;
package com.java.ingo.service;import com.java.ingo.girl.XiaoMei;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午8:54:24*类说明*/public class GetMarried {public void getMarried(){XiaoMei xm = new XiaoMei();//追求女生。。。。//旅游。。。//看电影。。。//玫瑰花。。。//逗开心。。。xm.sayYes();}}
1.5.创建XiaoMei.java。具体内容如下:

package com.java.ingo.girl;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午8:48:55*类说明*/public class XiaoMei {public void sayYes(){System.out.println("XiaoMei:"+"Yes,I do!");}}
1.6.创建XiaoLi.java,具体内容如下:

package com.java.ingo.girl;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午9:35:59*类说明*/public class XiaoLi {public void sayYes(){System.out.println("XiaoLi:"+"Yes,I do!");}}
1.7.测试方法:运行Boy.java中的main方法,就可以看到控制台的输出内容。

此时,我们就发现,当Boy调用getMarried时,我们需要创建XiaoMei对象,并且需要针对当前的XiaoMei对象进行一系列的动作处理,最后,XiaoMei对象才能被我们使用。当我们创建的对象变为XiaoLi时,我们需要修改getMarried中的全部内容,才能使用XiaoLi对象。这么做的缺点显而易见,因此,我们需要转化另外一种方式来改造我们的getMarried方法,使得我们在改变创建的对象是,getMarried方法整体上不用修改。当然,这里的修改方式有多种方式,下面我们就使用java的多态,Spring分别来演示改造方法。

二.使用java多态改造。

2.1改造之后的工程结构如下图所示:


2.2创建Girl.java文件,具体内容如下:

package com.java.ingo.girl;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午9:58:18*类说明*/public interface Girl {public void sayYes();}
2.3修改XiaoMei.java,XiaoLi.java实现此接口

2.4修改GetMarried.java文件,具体内容如下:

package com.java.ingo.service;import com.java.ingo.girl.Girl;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午8:54:24*类说明*/public class GetMarried {private Girl gril;public void setGril(Girl gril) {this.gril = gril;}public void getMarried(){/**XiaoMei xm = new XiaoMei();//追求女生。。。。//旅游。。。//看电影。。。//玫瑰花。。。//逗开心。。。xm.sayYes();*/gril.sayYes();}}
2.5修改Boy.java,具体内容如下;

package com.java.ingo.boy;import com.java.ingo.girl.XiaoMei;import com.java.ingo.service.GetMarried;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午8:47:57*类说明*/public class Boy {public static void main(String[] args) {GetMarried getMarried = new GetMarried();getMarried.setGril(new XiaoMei());getMarried.getMarried();}}
2.6如上面所示,当Boy想要使用getMarried时,就不再需要在getMarried中在实现创建对象等动作,而是直接的使用一个符合要求的对象即可。

2.7测试方法:运行Boy.java中的main方法,就可以看到控制台的输出内容。

三.使用Spring来改造

3.1创建beans.xml,存放位置为:src/main/resources下,具体内容如下:

<?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="XiaoLi" class="com.java.ingo.girl.XiaoLi"></bean>  <bean id="XiaoMei" class="com.java.ingo.girl.XiaoMei"></bean>  <bean id="GetMarried" class="com.java.ingo.service.GetMarried">  <property name="gril" ref="XiaoLi"></property>  </bean></beans>
上面的配置文件中,我们首先针对每一个对象创建一条bean。再针对结婚这个动作创建一个bean,并且结婚的bean的内部有一个结婚对象的属性,属性名称对应与GetMarried.java中的属性名称,属性的值使用ref来设置为另外两个bean的id值。关于这个属性的设置及用法,我们将在后续文章中进行介绍,敬请期待!

3.2修改Boy.java文件,具体内容如下:

package com.java.ingo.boy;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.java.ingo.girl.XiaoMei;import com.java.ingo.service.GetMarried;/***@author 作者 E-mail:ingo*@version 创建时间:2016年2月28日上午8:47:57*类说明*/public class Boy {public static void main(String[] args) {//首先读取配置文件,配置文件中的bean将会保存到ApplicationContext的实例中ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:beans.xml");//从ApplicationContext的实例中按照id值获取对应类的实例对象,并且需要进行强制类型GetMarried gm = (GetMarried) ac.getBean("GetMarried");//使用对象的内部方法,就像我们使用new创建的对象一样gm.getMarried();}}
从main方法中,我们可以看到,只保留了结婚的动作,彻底的隐藏了结婚对象。而结婚的对象交给spring去管理。当结婚对象发生改变时,我们修改的是spring配置文件,而不是源代码。

3.3测试方法:运行Boy.java中的main方法,就可以看到控制台的输出内容。

--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,白话Spring(基础篇)---IOC结束


备注:

本文基于前文maven教程与Spring--helloworld工程来创建和使用,如果有读者对于工程的建立有疑问,请参考前文内容,在进行理解。

参考资料:

Spring官网:http://spring.io/docs

其他博文:http://blog.csdn.net/it_man/article/details/4402245













2 1
原创粉丝点击