一、Spring IOC的概述
控制反转(Inversion of Control,缩写为IoC),是Spring的核心思想之一,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。(维基百科)
通俗地讲就是类的创建和销毁交给Spring容器去管理,编程人员只需要进行简单的配置便可以进行开发。
二、Spring IOC的底层原理实现
Spring IOC的最重要的作用即是解耦合,将类交给Spring管理,下面以JavaWeb的编程为例从传统的编程角度出发,探究Spring IOC的底层原理实现。
传统的编程模式下,如果我们需要实例化一个对象,则需要使用关键字new:
然而这种办法没有符合面向接口编程的思想,所以将其修改
在面向接口的思想下,传统模式编程是这样实现的:
面向接口编程了以后比原来的做法好了许多,但是Web层直接创建一个Service层的对象,使得Web层与Service层之间存在耦合,而一个良好的程序应该满足ocp原则:open-close原则,即对程扩展是open的,对于修改代码是close的,意思是尽量在不修改源代码的情况下,实现对程序功能进行扩展。
为了使Web层与Service层解耦合,可以使用工厂设计模式,Web层不直接创建Service层的对象,而是通过工厂创建,是这样实现的:
使用工厂设计模式确实将Web层与Service层解耦合,但是Web层与工厂之间存在耦合,当需要修改程序时,虽然不需要修改创建对象的代码,但是需要修改工厂的代码。
综合以上,Spring IOC的本质其实是“工厂 + 配置文件 + 反射” 模式生成对象,实现程序之间完全解耦合,实现简图:
如图所示,Web层在创建对象时只需要将配置文件上对应的bean的id输入,然后工厂便会读取配置文件对应的类的全类名,再由反射创建出实例,从而实现解耦合。
以上便是Spring IOC底层实现的原理。
三、Spring IOC入门小案例
Spring版本:4.3.3.RELEASE
开发工具:IDEA2018
1.构建JavaWeb工程,添加Maven支持
完整Maven依赖如下:
org.springframework
spring-context-support
4.3.3.RELEASE
junit
junit
4.10
在主目录下创建servic包,并在service包中创建impl包,然后再在主目录下创建test包。完整包结构如下:
2.编写业务代码
在service包下创建UserService接口,编写代码如下:
/**
* 用户service类
*/
public interface UserService {
//增加
public void add();
//删除
public void delete();
//修改
public void update();
//查找
public void find();
}
在service的impl包下创建UserServiceImpl类,代码如下:
/**
* 用户service实现类
*/
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("增加一个用户");
}
public void delete() {
System.out.println("删除一个用户");
}
public void update() {
System.out.println("修改一个用户");
}
public void find() {
System.out.println("查找一个用户");
}
}
3.创建并编写Spring的配置文件
按照如下步骤创建Spring配置文件,命名自定义,在这里我将其定义为beans.xml:
beans.xml内容如下:
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">
4.编写测试代码测试程序
在test包下测试类,代码如下:
public class TestSpringIOC {
@Test
public void testUserService(){
//加载配置文件,创建工厂
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
//由工厂根据bean的id创建对象
UserServiceImpl us = (UserServiceImpl) ac.getBean("UserService");
us.add();
us.delete();
us.find();
us.update();
}
}
执行结果如下:
四、总结
本文首先介绍了Spring IOC的基本概念,然后通过一个Web代码的例子,从传统的开发模式一步一步地优化,直到最后引出了Spring IOC的设计理念,非常简单通俗易懂地解释了Spring IOC的底层实现原理,最后通过一个小案例接触了Spring IOC的xml形式的编程。感谢您的阅读,如有错误请不吝赐教!