Spring IOC 控制反转
——注意:本次学习开发使用Spring4.3.7和相关jar包(见本文内),使用Eclipse Oxygen2版本,相关学习开发最好使用相同 版本,建议使用:
Spring4.0以上版本(Spring官网可下载);
相关jar包(建议从Spring官网全部下载,以后挑选使用);
JDK1.8(JAVA官网可下载);
Eclipse Oxygen以上版本(Eclipse官网可下载);
相关开发文件及资料百度云盘下载地址可以关注博主个人微信公众号:EJMan24 回复:tool 获取
IOC:Inversion of Control控制反转,顾名思义,就是控制权的转移,就是从前要自己在本类中new的对象,交给Spring框架去new,实现类之间的解耦
例如:
无框架:Object obj = new Object(); // 程序员控制new对象
Spring 框架中:Objectobj=SpringContainer.getObject(“obj”); //伪代码,即在Spring容器中创建对象,之后可从Spring容器中调取对象使用。
Spring IOC具体案例开发流程
1. 创建工程 工程是基础,任何框架都是实现在工程的基础上的
2. 导入jar包和JUnit 4 导入jar包实现spring的功能支持
3. 创建类 确定交给Spring可以用来实例化的类
4. Spring的配置文件 spring的清单文件,指定哪些类交给Spring实例化对象
5. 启动Spring容器 读取清单文件并按照清单文件注意实例化对象
6. 从Spring容器中取出对象 取出并使用对象
所有的Spring IOC基础开发案例都基本遵循这一开发流程(后期添加DI和AOP后可能有所不同)。
接下来我们按步骤实现一次Spring IOC的开发流程(需要开发工具Eclipse、JDK1.8、相关jar包):
1. 创建工程
在Eclipse中创建工程:File》new》project》java project》next
命名工程名为TestSpringIOC》finish
2. 导入的jar包和Junit4
一般在src源目录下创建一个lib文件夹用来放置导入的jar包,将下载的jar文件拷贝粘贴到lib文件夹以后右键jar包Bulid Path将jar包导入到ReferencesLibrary中。
JUnit4导入(用于test功能测试):windows》preferennce》java》JUnit》
在右边选项框中add》JUnit4
Spring IOC需要导入以下基本包:
commons-logging-1.0.4.jar
spring-beans-3.2.3.RELEASE.jar
spring-context-3.2.3.RELEASE.jar
spring-context-support-3.2.3.RELEASE.jar
spring-core-3.2.3.RELEASE.jar
spring-expression-3.2.3.RELEASE.jar
spring-test-3.2.3.RELEASE.jar //用于方法测试
所有jar包都可从官网下载:http://repo.spring.io/release/org/springframework/spring
导入后具体实现如下图:
3. 创建类(测试使用)
在src(源码文件)目录下创建Hello类,包名取为com.spring.ioc,并输入以下代码:
package com.spring.ioc
public classHello{
public void sayHello( ) {
System.out.println(“HelloSpring”);
}
}
具体实现如下图:
4. 创建Spring配置文件,清单文件(指定哪些类需要Spring实例化)
在src文件夹下,创建文件夹(new> other> Floder)命名为resources,在resources文件夹中创建spring_ioc.xml,在spring_ioc.xml文件中添加文件约束代码和指定实例化对象代码如下:
<?xmlversion="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" // xsi:schemaLocation的导入是为了能自动拼写,方便开发
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
Spring清单文件,指定Spring框架要对com.spring.ioc.Hello创建对象
-->
<bean id="Hello"class="com.spring.ioc.Hello"></bean>
</beans>
PS.此 XML文件模板(即约束条件)一定要从对应的开发文档上获取(官网开发文档),并且一定要注意版本匹配问题!此版本是较全面的简洁版本,基本满足后期Spring核心框架的开发需求。

5. 启动spring容器
6. 从Spring容器中获取对象并测试
由于本次实例较为简单,第五步和第六步统一放在一个类中执行,具体步骤为:
1) src文件夹下新建Test源代码文件夹(New SourceFolder)用于放置测试类
2) 创建测试类TestSpringIOC,包名取为com.spring.testhello
3) 测试类TestSpringIOC中添加@test标签(JUnit4导入后可以使用,也可以导入JUnit5),创建测试方法public void test1(){} 注意:@test标签用于方法上,所以一般添加在测试方法的前面。
4) 测试方法test1内写入启动spring容器的代码,以及从spring容器中获取对象并测试的方法,注意导包
5) 双击方法test1,右键Run as》JUnit
6) 得出测试结果,完成SpringIOC控制反转的学习测试
具体实现代码如下
1) package com.spring.testHello;
2) import org.junit.Test;
3) import org.springframework.context.ApplicationContext;
4) import org.springframework.context.support.ClassPathXmlApplicationContext;
5)
6) import com.spring.ioc.Hello;
7)
8) public class TestSpringIOC {
9) @Test
10) public void test1(){
11) //启动spring容器(根据Spring配置文件不同创建不同的Spring容器)
12) ApplicationContextcontext =
13) newClassPathXmlApplicationContext(
14) "resources/spring_ioc.xml");
15) //从spring容器中获取对象hello
16) Hello hello = (Hello)context.getBean("Hello");
17) //使用hello对象调用sayHello方法
18) hello.sayHello();
19) }
20)}
得到Hello对象的sayHello方法的打印结果:
测试完成,即可以从Spring容器中的到Hello对象,并且Hello对象的控制权在Spring容器中,并非程序员控制,实现SpringIOC。
总结
1.在我们获得Hello对象的过程中,核心需要完成的是这样的事情:
1) 在spring 的配置清单文件中配置要实例化对象的清单,即<Bean></Bean>
2) 由spring容器,读取清单文件并逐一实例化对象
即:Hello hello=spring容器.getBean(“容器中对象的唯一id”);
此时获得的是Object对象,还需要强转为Hello对象
在java范畴中万物皆Object,在 Spring中万物皆Bean。Bean是Spring的核心、基础、根源。还需要注意到的是 Spring中对象实例化的具体时间,是在具体需要引用对象的时候创建(lazy),还是在Spring容器启动的时候自动创建,这关系到程序 运行的效率和计算机内存的使用率,这些细节我在后面的学习开发中会慢慢完善。有疑惑的可以私信询问。
2.一般常见的Spring初期错误有三大类:
1) 基础jar包没有导入,这些jar包可能在开始学习的时候不太熟悉,可以慢慢了解每个jar包的用途,先可以根据本人提供的信息使用,也可以网上具体一个一个查,理解最好。
2) Spring的Xml配置文件中写错:
xml文件的配置头已经具体很完善反应在本文中了,如果想了解也可以官网上查询具体的案例一步步理解。
<Bean id=”className” class=”classPath”></Bean>中,id必须唯一,且不能带有特殊字符,因为这个是Spring容器创建对象时,给对象的名字,如果不唯一,就像一个类中创建两个同类型的同名对象,运行时会报错。
class路径必须写对,什么包下什么类,大小写要注意。路径可以相同,可以根据相同的类路径创建多个不同的对象,然后根据对象名调用同类型的不同对象。
SpringIOC中也有根据类的类型调用对象(ByType),但使用的较少,因为可读性不高,且调用时可能产生异常(Object not only Exception对象不唯一异常),所以一般使用根据对象名(id唯一)调用对象。
3) 测试文件test类中,在启动Spring容器时,配置文件的路径写错,这样也会报没有配置文件无法找到,无法创建Spring的异常。配置文件的相对路径是相对于源代码文件夹src的,所以在src下寻找创建xml的包,以及正确的xml文件名。