java ioc 原理,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:

a1f0bc3e3746288ea333fead1c15b9e1.png

然而这种办法没有符合面向接口编程的思想,所以将其修改

在面向接口的思想下,传统模式编程是这样实现的:

5a09a25b695a20022690e9996aea424a.png

面向接口编程了以后比原来的做法好了许多,但是Web层直接创建一个Service层的对象,使得Web层与Service层之间存在耦合,而一个良好的程序应该满足ocp原则:open-close原则,即对程扩展是open的,对于修改代码是close的,意思是尽量在不修改源代码的情况下,实现对程序功能进行扩展。

为了使Web层与Service层解耦合,可以使用工厂设计模式,Web层不直接创建Service层的对象,而是通过工厂创建,是这样实现的:

dee69a6b27c2151a3ce7b036621cc42b.png

使用工厂设计模式确实将Web层与Service层解耦合,但是Web层与工厂之间存在耦合,当需要修改程序时,虽然不需要修改创建对象的代码,但是需要修改工厂的代码。

综合以上,Spring IOC的本质其实是“工厂 + 配置文件 + 反射” 模式生成对象,实现程序之间完全解耦合,实现简图:

9c468cb57f9919b56486af295590521e.png

如图所示,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包。完整包结构如下:

32a51c745ee07bae568e6170ed9244df.png

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:

f0cd359238ca0f6a98a5e8ee27997000.png

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();

}

}

执行结果如下:

f3004e248d8add900017e3ebd176a96d.png

四、总结

本文首先介绍了Spring IOC的基本概念,然后通过一个Web代码的例子,从传统的开发模式一步一步地优化,直到最后引出了Spring IOC的设计理念,非常简单通俗易懂地解释了Spring IOC的底层实现原理,最后通过一个小案例接触了Spring IOC的xml形式的编程。感谢您的阅读,如有错误请不吝赐教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值