IOC:控制反转(Inverse of Control)
-
概念解释
其实不难理解,所谓控制反转反转控制就是反转了你创建对象或是获得对象的方式,在这之前,我们想要获得一个对象最简单的方法就是new一个
GirlFriend girlfriend = new GirlFriend();
或者我们有想起来在学设计模式的时候见过一个模式
工厂模式:
调用者先找到被依赖对象的工厂,然后通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。
简单来说就是你想要调用一个java对象(被依赖对象)的方法,你得先去一个工厂类里面获取它,然后再调用它里面的方法,而不是直接new一个。
//1、我们先来整一个顶级的女朋友接口
public interface GirlFriend {
public void say();
}
//2、再整两个不同的实现类
//这是我的女朋友
public class MyGirlfriend implements GirlFriend{
public void say(){
System.out.println("null");
}
}
//其他人女朋友
public class OtherGirlFriend implements GirlFriend{
public void say(){
System.out.println("I Love You");
}
}
//3、我们整个女朋友工厂
public class GirlFriendFactory{
public GirlFriend produce(String type){
if("my".equals(type)){
return new MyGirlFriend;
}else if("other".equals(type)){
return new OtherGirlFriend;
}
}
}
//4、我们开始测试
public class Demo{
public class test{
//这里我们先来个工厂
GirlFriendFactory factory = new GirlFriendFactory();
GirlFriend myGirlFriend = factory.produce("my");
myGirlFriend.say();
}
}
//结果: null
我们可以看到,这两种方式其实都是属于硬编码类型的方式,我们都在主动去创建对象,不管是第一种还是第二种耦合都很大,不利于代码的维护升级。我们在学软件工程的时候肯定听过一句话:“低耦合,高内聚”。而Spring的控制反转机制的目标就是这个,在Spring中,它将对象之间的依赖关系转化为用配置文件(xml)来管理,你不用自己去new对象,只需要按要求编写好配置文件,等到需要调用某个对象方法时去跟Spring容器要就可以,这样就完成了所谓的控制反转。
那么到底我们如何利用Spring来完成这一操作,看下面代码演示
- 代码演示
假设你已经导包。
//首先我们来个实体类
public class Dog{
public void bark(){
System.out.println("wang wang Spring!!");
}
}
下面我们来一个配置文件,名字不限,但一般约定使用applicationContext.xml
bean标签可以去看我的bean详解,不过这里可以先等等,因为这里主要是为了理解IOC,我们就把它理解为在配置文件里面 “声明了一个dog对象” ,但记住这样理解只是为了理解IOC,当我们学完bean就不能这样理解了。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 下面这些是约束-->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 将User对象交给spring容器管理 -->
<!-- Bean元素 -->
<bean name = "dog" class = "com.test.entity.Dog."></bean>
</beans>
配置文件也有了,我们下面去测试一波
//我们写个测试类
public class Demo{
//junit单元测试,可以去看我的junit详解
@Test
public void test(){
//1、创建容器对象 我这里applicationContext.xml文件前面没有其他路径名是因为我直接放在了src目录中,如果不是你需要复制完成路径
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//2、向容器要对象
Dog dog = (Dog)ac.getBean("dog");
//3、调用方法
dog.bark();
}
}
输出:wang wang Spring!!!
可以看到,在这个示例中,我们并没有涉及到主动new一个对象这种操作,而是让Spring创建,我们去Spring容器里面取就行了,我们只需将xml文件按要求编写即可获得我们想要的对象。
IOC控制反转完毕,喝杯茶歇歇。