内容简介
一、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依赖如下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.3.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies>
- 在主目录下创建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内容如下:
<?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"> <!-- 在配置文件中配置,将UserServiceImpl的创建交给Spring--> <bean id="UserService" class="com.spring.service.impl.UserServiceImpl"/> </beans>
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形式的编程。感谢您的阅读,如有错误请不吝赐教!