Spring学习之路(一):理解Spring IOC的实现原理及入门案例

一、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形式的编程。感谢您的阅读,如有错误请不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值