前言
通过前面的简介我们知道了Spring的大致作用,本章将讲解它的第一个功能,IOC
方法
1.概念
IOC的英文名称:Inversion of Control
IOC的中文名称:控制反转
作用:在使用Spring以前,我们创建对象基本上由我们程序员自行的手动“new”一个对象出来,控制反转的概念就是将创建对象的操作交给我们的Spring,由他来管理对象。也就是说,控制的是控制类的对象,反转是交给Spring来负责!
2.Spring的基本环境配置
1)导入相应jar包
由于我们学过了Maven,这里就无需自己导jar了,直接在pom.xml中进行相关配置:
我们知道,最基本的四个包需要导入:Beans,Core,Context,SpEL
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
2)配置Spring配置文件:
官方给出的配置文件名称为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">
</beans>
3)在applicationContext.xml中配置bean
既然我们把对象的创建过程交给了Spring来做,那么我们要让Spring知道需要创建哪些对象。所以将使用该配置文件进行配置!
示例:使用bean标签创建User对象
<?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代表用于标识对象,class指定对象的路径 -->
<bean id="user" class="cn.edu.ccut.bo.User"></bean>
</beans>
4)配置测试类加载XML并取得User对象
import cn.edu.ccut.bo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
public void testApplicationContext(){
//加载spring配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取User对象
User user = ac.getBean("user", User.class);
System.out.println(user);
}
}
观察打印的结果:
这就证明了Spring已经帮助我们创建好了相关的对象。
这里可能你会觉得直接new出来不是比这个要简单?不要急,我们之后将知道它的好处,这里只是简单讲解。
3.Spring创建bean的三种方式
1)构造方法
- 无参构造方法(默认):我们上面的例子就属于调用了无参的构造方法创建的User对象
我们在构造方法中添加以下语句进行验证:
再次执行上面的测试方法:
- 有参构造方法
在配置文件中进行如下配置:
<?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代表用于标识对象,class指定对象的路径 -->
<bean id="user" class="cn.edu.ccut.bo.User">
<!-- 使用constructor-arg标签进行有参构造创建bean-->
<!-- index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 -->
<!-- value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean -->
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
</bean>
</beans>
运行之前的测试方法看一下效果:
2)实例工厂
该方式利用的是工厂设计模式。
创建对应工厂类:UserFactory.java
package cn.edu.ccut.factory;
import cn.edu.ccut.bo.User;
public class UserFactory {
public User newInstance(){
return new User();
}
}
对配置文件进行如下配置:
<?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代表用于标识对象,class指定对象的路径 -->
<!--<bean id="user" class="cn.edu.ccut.bo.User">
<!– 使用constructor-arg标签进行有参构造创建bean–>
<!– index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 –>
<!– value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean –>
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
</bean>-->
<!-- 创建工厂类的bean -->
<bean id="userFactory" class="cn.edu.ccut.factory.UserFactory"/>
<!-- factory-bean代表工厂的bean,factory-method代表工厂方法 -->
<bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>
</beans>
运行测试类查看效果:
3)静态工厂
创建对应工厂类:UserFactory.java
package cn.edu.ccut.factory;
import cn.edu.ccut.bo.User;
public class UserFactory {
public static User newInstance(){
return new User();
}
}
对配置文件进行如下配置:
<?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代表用于标识对象,class指定对象的路径 -->
<!--<bean id="user" class="cn.edu.ccut.bo.User">
<!– 使用constructor-arg标签进行有参构造创建bean–>
<!– index代表参数索引,从0开始表示第一个参数... , name代表参数的名字 , type代表参数的类型 –>
<!– value表示参数的值,可以为基本数据类型和String等 , ref表示参数的值是其他bean –>
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
</bean>-->
<!--<!– 创建工厂类的bean –>
<bean id="userFactory" class="cn.edu.ccut.factory.UserFactory"/>
<!– factory-bean代表工厂的bean,factory-method代表工厂方法 –>
<bean id="user" factory-bean="userFactory" factory-method="newInstance"></bean>-->
<!-- class表示工厂类型 factory-method代表工厂方法 -->
<bean id="user" class="cn.edu.ccut.factory.UserFactory" factory-method="newInstance"></bean>
</beans>
运行测试类查看效果:
附录:
1.scope属性
<bean>标签存在一个scope属性,该属性定义了该对象的有效范围(单例、多例等)
目前在没有学习SpringMVC的条件下,其有两个可选值:
- singleton:默认值,单例
- prototype:多例,每次获取需要重新实例化