`
相伴随风
  • 浏览: 6666 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Spring 核心思想 之反向控制概念解析(有例子)

阅读更多
“反向控制”的意思书上说很简单,开发人员通常把它理解为“实现必须依赖抽象”或者面向接口编程。这句话对于完全不知道的人来说还是完全不知道。。。想起了两个月前的我
下面我把让我理解了这个概念的例子搬上来,与大家共享下。

这个示例主要讲的是如何通过IOC实现具体的业务逻辑,以及如何向不同的存储位置存储数据,我们可能用到的存储方式有三种:
            1.向数据库存储数据(不会在例子中出现)
            2.向XML中存储数据
            3.向文本文件中存储数据
说明概念的思路是:首先我们介绍编写这类程序通常的做法,然后指出这种做法的不足,接着会给出一种比较好的做法,即通过IOC来实现这类功能,最后对这种做法进行总结,使读者一步一步地了解IOC。
由于是讲解概念,所以我们能省的就省。
  首先我们写向XML中存储数据的程序:
通常编写这类程序都是先编写一个向XML存储数据的类XMLData.java,其中saveXML是XMLData类的一个方法,负责向XML存储数据。
//************ XMLData.java *******************//
public class XMLData {
     ...
     //向XML中存储数据
     public void saveXML() {
        ...
     }
}

业务逻辑类Business.java 通过 XMlData.java中的方法向XML中存储数据Business.java的示例代码如下:
//************ Business.java *******************//
public class Business {
     private XMLData db = new XMLData();
     ...
     //向XML中存储数据
     publc void saveData() {
        ...
        db.saveXML();
        ...
     }
}


上面业务逻辑类Business.java和数据存储类XML.java都被设计为实体类,不足之处在于Business类依赖于XML.java类。如果业务改变,用户现在要求向文本文件中存储数据,显然这个时候程序已经不适用了,必须要修改Business类。
   我们先修改为向文本文件中存储数据,再来改变Business类。TXTData.java的示例如下。其中saveTXT()是TXTData类中的一个方法,具体负责向文本文件中存储数据。
//************ TXTData.java *******************//
public class TXTData {
     ...
     //向文本文件中存储数据
     public void saveTXT() {
        ...
     }
}

然后我们要改向TXT中存储数据,所以就必须得修改业务逻辑类Business.java,改为向TXT中存储数据。Business.java的示例代码变为:
//************ Business.java *******************//
public class Business {
     private TXTData db = new TXTData();
     ...
     //向文本文件中存储数据
     publc void saveData() {
        ...
        db.saveTXT();
        ...
     }
}

可以看到,这里对业务逻辑类Business的改动比较大,在这里讲解存储方式的改变,目的是让你明白,这是个多么不好的设计方案:因为每次业务需求的变动都要导致程序的大量修改。
下面我们利用IOC来解决这个问题,编写的思路是:首先我们编写一个存储数据的接口,然后每个具体负责存储数据的类都实现这个接口,如前面的XMLData.java,TXTData.java。而在业务逻辑类Business里,则针对存储数据的接口编程,并不与存储数据的类建立任何直接的联系。这样一来的话,存储方式发生任何变化都不糊要修改业务逻辑类Business.java。
1,首先我们来编写个存储数据的接口SaveData,让该接口中定义一个方法saveData()用来负责存储数据,这样一来的话,任何一个具体负责存储数据的类都要实现这个方法,而我们的业务逻辑类只针对接口中的saveDate()方法编程就行.
//************ SaveData.java *******************//
public interface SaveData{
    //该方法用来存储数据
    public void saveData();
}

2,接下来我们编写个具体负责向XNL存储数据的类XMLData,该类实现了接口SaveData。
//************ XMLData.java *******************//
public class XMLData implement SaveData{
    //该方法用来存储数据
    public void saveData() {
        //以下是具体负责向XML存储数据的代码
        ...
    }
}

3,编写业务逻辑类Business,该类只针对接口SaveData编码,而不是针对实体类。
//************ Business.java *******************//
public class Business {
    //针对接口SaveData定义变量
    private SaveData db;
    public void setSaveData (SaveData db) {
        this.db = db;
    }
    ...
    //根据注入的存储类,存储数据
    public void saveData() {
        ...
        db.saveData();
        ...
    }
}

4,编写测试类Test
//************ Test.java *******************//
public class Test {
    private Business business = new Business();
    ...
    //根据注入的存储类,存储数据
    public void saveData() {
        ...
        business.setSaveData(new XMLData());
        business.saveData();
        ...
    }
}
通过这种方法,Business就可以重用了,不管采用哪种存储方式来存储数据,Business类都不需要改动了,只需要实现具体的SaveData接口就可以了。
5,编写具体负责向文本文件存储数据的类TXTData,该类实现了接口SaveData。TXTData.java的示例代码:
//************ TXTData.java *******************//
public class TXTData implement SaveData{
    //该方法用来存储数据
    public void saveData() {
        //以下是具体负责向文本文件存储数据的代码
        ...
    }
}
6,业务逻辑类Business在这里就不需要做任何的改变,只需要修改测试类Test:
//************ Test.java *******************//
public class Test {
    private Business business = new Business();
    ...
    //根据注入的存储类,存储数据
    public void saveData() {
        ...
        business.setSaveData(new TXTData());
        business.saveData();
        ...
    }
}
   这些就是例子的全部了,通过上面我们应该了解到一些“面向接口编程”的好处,它使得业务逻辑代码实现了重用,从而实现了如果不是业务逻辑发生变化,就可以不要修改逻辑的相关代码,这里就是IOC的强大之处。
   最后 你可能会有些疑问了:虽然明白了“面向接口编程”的好处,可为什么叫做“反向控制”呢?其实它的意思就是说:原来由业务逻辑来控制具体的存储方式,即业务逻辑里编写具体的存储方式,面向接口后,不在业务逻辑里编写具体的存储方式了,而是在调用业务逻辑的类里来控制具体的存储方式,好像是由具体的存储方式来控制业务逻辑(给你这种感觉),所以把它叫做“反向控制”
(这篇文章是我看着书本弄出来的,所以不能标原创了, 网上好像缺少这种比较具体的,至少我当时在网上找了很久都没有找到我想要的这种)
首先把这篇文章写给以前惶惶然的自己,写给需要的朋友们,有什么错误可以在评论里提醒下,万分感谢 远方的朋友
分享到:
评论

相关推荐

    SPRING_AOP_概念解析以及例子示范.docx

    AOP的核心概念包括: 1. **通知(Advice)**:通知定义了切面在何时何地执行。在Spring中,有五种不同类型的Advice:`Before`(前置通知)、`After-Returning`(返回后通知)、`After-Throwing`(异常后通知)、`...

    spring的核心思想

    #### 一、Spring框架简介与核心概念 Spring框架是一个开源的轻量级Java开发框架,主要用于简化企业级应用的开发工作。它提供了全面的基础架构支持,包括但不限于依赖注入(Dependency Injection,简称DI)、面向切...

    SPRING AOP 概念解析以及例子示范

    **SPRING AOP 概念解析以及例子示范** 在Java开发中,Spring框架因其强大的功能和灵活的设计,被广泛应用于企业级应用。其中,AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它...

    Spring核心思想

    Spring核心思想分为控制反转(IOC)和切面编程(AOP)。

    Spring核心概念

    Spring核心概念

    Spring核心源码解析.pdf

    本篇文档将对Spring框架的核心源码进行解析,以帮助开发者更深入地理解Spring的工作原理和核心概念。 首先,Spring框架通过使用IoC容器来管理应用对象的创建和依赖关系。这种做法可以让程序员从创建对象的复杂性中...

    Spring 源代码解析

    Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码...

    Spring技术内幕:深入解析Spring架构与设计原理[汇编].pdf

    本文将深入解析Spring架构和设计原理,对Spring的核心概念、架构设计和关键技术点进行详细介绍。 1. Spring架构设计原理 Spring架构设计的核心思想是松耦合和高内聚,通过将应用程序分解为多个模块,来提高系统的...

    Spring例子

    Spring框架是Java开发中的一个核心组件,主要用于简化企业级应用的开发。它提供了一个全面的编程和配置模型,旨在提高生产效率,同时鼓励面向接口的编程和依赖注入(DI)原则。Spring MVC是Spring框架的一个模块,专...

    spring技术内幕第2版深入解析spring架构与设计原理

    在深入解析Spring技术内幕第2版中,会详细探讨Spring框架的核心架构与设计原理,Spring作为一个轻量级的Java平台,提供了全面的编程和配置模型,是企业级Java应用程序开发中广泛使用的技术之一。 Spring的核心特性...

    Spring MVC 向导控制器完整的例子

    这是一个简单完整的Spring MVC向导控制器(AbstractWizardFormController)的例子,包含所需的类包,可以运行,也是我重新熟悉Spring 的第二例子,明天再上传Spring 的例外个例子,如有问题,我们可以互相学习下.

    Spring源代码解析

    Spring源代码解析(一):IOC容器 Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源...

    Spring源码解析.zip

    本压缩包“Spring源码解析”提供了对Spring框架核心组件——IOC(Inversion of Control,控制反转)、AOP(Aspect Oriented Programming,面向切面编程)以及Transaction(事务管理)的源码分析,帮助开发者更全面地...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》一书深入浅出地介绍了Spring框架的核心概念和技术细节,对于希望深入了解Spring内部工作机制的开发者来说是一本非常有价值的参考书籍。通过学习本书,...

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从...

    Spring 核心jar包

    7. **MVC框架**:Spring MVC是Spring用于构建Web应用程序的模块,提供模型-视图-控制器架构,支持RESTful风格的URL,提供视图解析、数据绑定、模型验证等功能。 8. **Spring表达式语言(SpEL)**:SpEL是Spring提供...

    Spring源码深度解析第二版

    Spring框架的容器是其核心组件之一,负责管理Bean的生命周期,并提供了依赖注入、AOP等功能。容器的基本用法主要包括了创建容器、添加Bean和获取Bean等。 2.2 功能分析 容器的功能分析主要包括了Bean的生命周期、...

    SPRING学习小例子

    本篇将深入解析“SPRING学习小例子”,涵盖Spring的核心特性——依赖注入(DI),事务管理,面向切面编程(AOP)以及数据库操作。 一、依赖注入(Dependency Injection,简称DI) 依赖注入是Spring的核心特性,它...

Global site tag (gtag.js) - Google Analytics