“反向控制”的意思书上说很简单,开发人员通常把它理解为“实现必须依赖抽象”或者面向接口编程。这句话对于完全不知道的人来说还是完全不知道。。。想起了两个月前的我
下面我把让我理解了这个概念的例子搬上来,与大家共享下。
这个示例主要讲的是如何通过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的强大之处。
最后 你可能会有些疑问了:虽然明白了“面向接口编程”的好处,可为什么叫做“反向控制”呢?其实它的意思就是说:
原来由业务逻辑来控制具体的存储方式,即业务逻辑里编写具体的存储方式,面向接口后,不在业务逻辑里编写具体的存储方式了,而是在调用业务逻辑的类里来控制具体的存储方式,好像是由具体的存储方式来控制业务逻辑(给你这种感觉),所以把它叫做“反向控制”。
(这篇文章是我看着书本弄出来的,所以不能标原创了, 网上好像缺少这种比较具体的,至少我当时在网上找了很久都没有找到我想要的这种)
首先把这篇文章写给以前惶惶然的自己,写给需要的朋友们,有什么错误可以在评论里提醒下,万分感谢 远方的朋友
分享到:
相关推荐
AOP的核心概念包括: 1. **通知(Advice)**:通知定义了切面在何时何地执行。在Spring中,有五种不同类型的Advice:`Before`(前置通知)、`After-Returning`(返回后通知)、`After-Throwing`(异常后通知)、`...
#### 一、Spring框架简介与核心概念 Spring框架是一个开源的轻量级Java开发框架,主要用于简化企业级应用的开发工作。它提供了全面的基础架构支持,包括但不限于依赖注入(Dependency Injection,简称DI)、面向切...
**SPRING AOP 概念解析以及例子示范** 在Java开发中,Spring框架因其强大的功能和灵活的设计,被广泛应用于企业级应用。其中,AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它...
Spring核心思想分为控制反转(IOC)和切面编程(AOP)。
Spring核心概念
本篇文档将对Spring框架的核心源码进行解析,以帮助开发者更深入地理解Spring的工作原理和核心概念。 首先,Spring框架通过使用IoC容器来管理应用对象的创建和依赖关系。这种做法可以让程序员从创建对象的复杂性中...
Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码解析Spring 源代码...
本文将深入解析Spring架构和设计原理,对Spring的核心概念、架构设计和关键技术点进行详细介绍。 1. Spring架构设计原理 Spring架构设计的核心思想是松耦合和高内聚,通过将应用程序分解为多个模块,来提高系统的...
Spring框架是Java开发中的一个核心组件,主要用于简化企业级应用的开发。它提供了一个全面的编程和配置模型,旨在提高生产效率,同时鼓励面向接口的编程和依赖注入(DI)原则。Spring MVC是Spring框架的一个模块,专...
在深入解析Spring技术内幕第2版中,会详细探讨Spring框架的核心架构与设计原理,Spring作为一个轻量级的Java平台,提供了全面的编程和配置模型,是企业级Java应用程序开发中广泛使用的技术之一。 Spring的核心特性...
这是一个简单完整的Spring MVC向导控制器(AbstractWizardFormController)的例子,包含所需的类包,可以运行,也是我重新熟悉Spring 的第二例子,明天再上传Spring 的例外个例子,如有问题,我们可以互相学习下.
Spring源代码解析(一):IOC容器 Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源...
本压缩包“Spring源码解析”提供了对Spring框架核心组件——IOC(Inversion of Control,控制反转)、AOP(Aspect Oriented Programming,面向切面编程)以及Transaction(事务管理)的源码分析,帮助开发者更全面地...
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》一书深入浅出地介绍了Spring框架的核心概念和技术细节,对于希望深入了解Spring内部工作机制的开发者来说是一本非常有价值的参考书籍。通过学习本书,...
《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从...
7. **MVC框架**:Spring MVC是Spring用于构建Web应用程序的模块,提供模型-视图-控制器架构,支持RESTful风格的URL,提供视图解析、数据绑定、模型验证等功能。 8. **Spring表达式语言(SpEL)**:SpEL是Spring提供...
Spring框架的容器是其核心组件之一,负责管理Bean的生命周期,并提供了依赖注入、AOP等功能。容器的基本用法主要包括了创建容器、添加Bean和获取Bean等。 2.2 功能分析 容器的功能分析主要包括了Bean的生命周期、...
本篇将深入解析“SPRING学习小例子”,涵盖Spring的核心特性——依赖注入(DI),事务管理,面向切面编程(AOP)以及数据库操作。 一、依赖注入(Dependency Injection,简称DI) 依赖注入是Spring的核心特性,它...