Spring松耦合实例

面向对象的概念,是一个很好的设计来打破系统进入一个组可重用的对象。然而,当系统变大,尤其是在Java项目,庞大的对象依赖关系将一直紧密耦合引起对象难以管理或修改。在这种情况下,可以使用Spring框架作为一个核心模块轻松高效地管理所有的对象依赖。

输出生成器的例子

让我们来看一个例子,假设你的项目有一个函数输出的内容,以CSV或JSON格式。您的代码可能看起来像下面的例子:

File : IOutputGenerator.java – 输出生成器接口

package com.zyzx.output;public interface IOutputGenerator
{public void generateOutput();
}

File : CsvOutputGenerator.java – 一个CSV输出生成器用来实现IOutputGenerator接口。

package com.zyzx.output.impl;import com.zyzx.output.IOutputGenerator;public class CsvOutputGenerator implements IOutputGenerator
{public void generateOutput(){System.out.println("Csv Output Generator");}
}

File : JsonOutputGenerator.java – 一个JSON输出生成器用来实现IOutputGenerator接口。

package com.zyzx.output.impl;import com.zyzx.output.IOutputGenerator;public class JsonOutputGenerator implements IOutputGenerator
{public void generateOutput(){System.out.println("Json Output Generator");}
}

有几个方法来调用IOutputGenerator,以及如何使用 Spring 来避免对象相互结合紧密。

1. 方法1 – 直接调用

正常的方式,直接调用它。

package com.zyzx.common;import com.zyzx.output.IOutputGenerator;
import com.zyzx.output.impl.CsvOutputGenerator;public class App
{public static void main( String[] args ){IOutputGenerator output = new CsvOutputGenerator();output.generateOutput();}
}

存在问题

以这种方式,这个问题是“output”紧密到CsvOutputGenerator耦合,输出生成的每一个变化可能涉及代码变化。如果此代码分散在你的项目中,输出生成的每一次变化都会让你受苦。

方法2 – 用辅助类调用它

可能想创建一个辅助类将所有输出实现在类的内部。

package com.zyzx.output;import com.zyzx.output.IOutputGenerator;
import com.zyzx.output.impl.CsvOutputGenerator;public class OutputHelper
{IOutputGenerator outputGenerator;public OutputHelper(){outputGenerator = new CsvOutputGenerator();}public void generateOutput(){outputGenerator.generateOutput();}}

通过辅助类调用它

package com.zyzx.common;import com.zyzx.output.OutputHelper;public class App
{public static void main( String[] args ){OutputHelper output = new OutputHelper();output.generateOutput(); }
}

存在问题

这看起来比之前的更优雅,只需要管理一个辅助类,但是辅助类仍是紧耦合 CsvOutputGenerator,输出生成的每一个变化仍然涉及小的代码更改。

方法3 – Spring

在这种情况下,Spring 依赖注入(DI)是一个不错的选择。Spring 可以让输出生成松散的耦合到输出发生器。

OutputHelper类更小的修改。

package com.zyzx.output;import com.zyzx.output.IOutputGenerator;public class OutputHelper
{IOutputGenerator outputGenerator;public void generateOutput(){outputGenerator.generateOutput();}public void setOutputGenerator(IOutputGenerator outputGenerator){this.outputGenerator = outputGenerator;}
}

创建一个 Spring bean 的配置文件,并在这里声明所有的Java对象的依赖。

<!-- Spring-Common.xml -->
<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-2.5.xsd"><bean id="OutputHelper" class="com.zyzx.output.OutputHelper"><property name="outputGenerator" ref="CsvOutputGenerator" /></bean><bean id="CsvOutputGenerator" class="com.zyzx.output.impl.CsvOutputGenerator" /><bean id="JsonOutputGenerator" class="com.zyzx.output.impl.JsonOutputGenerator" /></beans>

通过Spring来调用它

package com.zyzx.common;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.yiibai.output.OutputHelper;public class App
{public static void main( String[] args ){ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml"});OutputHelper output = (OutputHelper)context.getBean("OutputHelper");output.generateOutput();}
}

现在,只需要改变 Spring XML 文件使用不同的输出生成器。只修改 Spring XML 文件而不需要无码修改,这意味着更少的错误。

结论

有了Spring框架 - 这种依赖注入(DI)为对象的依赖关系管理有用的特性,使大型Java项目开发管理中更优雅的,高度灵活和便于维护。

Spring(5)---松耦合实例相关推荐

  1. Spring松耦合的个人理解和代码实例

    Spring松耦合的个人理解和代码实例 理解Spring的松耦合概念,那么我们先来看看一个不使用Sring的实例代码 先看一下整个测试项目案例的结构 正常方式 创建一个接口,这个接口指定车辆的行驶速度 ...

  2. Spring松耦合的实现

    HelloShiyanlou 与松耦合的实现 一.实验介绍 1.1 实验内容 本节实验将带你入门简单的 Maven 项目创建和如何实现松耦合. 1.2 实验知识点 Maven 介绍 Spring 松耦 ...

  3. 案例学习BlazeDS+Spring之八InSync06“松耦合”UI同步事件通知

    InSync06:增加"松耦合"UI同步事件通知 一.运行DEMO: 1.运行程序:http://localhost:8400/spring-flex-testdrive/insy ...

  4. 接口的作用和使用实例(何为紧耦合和松耦合)

    在介绍接口Interface的主要功能之前,我们先介绍一下什么是紧耦合 class Program{static void Main(string[] args){var engine = new E ...

  5. 使用RabbitMQ实现松耦合设计

    我们把三种交换器讲解完毕了,我们再来看一下,如果使用RabbitMQ,实现松耦合设计,要讲松耦合,我们得先回到就是为什么要使用RabbitMQ,解决什么问题,在这章节当中呢,分别给大家介绍了一下,我们 ...

  6. MEF实现设计上的“松耦合”(一)

    1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展, ...

  7. 松耦合式的权限控制设计,自定义权限表达式

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  8. DIP依赖反转原则——实现松耦合的设计

    在<IoC控制反转设计原则--实现松耦合>我们将控制工作委派给其他类来完成,向松耦合设计又迈进了一步.但是我们类仍然依赖着具体的类,所以我们可以使用DIP(依赖反转原则)来进一步获得松耦合 ...

  9. 一个简易的下拉刷新松耦合实践

    前言 在iOS平台,许多App的下拉刷新都是使用的MJRefresh这个开源库,笔者所接触开发过的几个App就是这样.当然还有很多效果酷炫的下拉刷新,真是不得不佩服开源界大神们的创意!这里是一些厉害框 ...

最新文章

  1. WPF 与Surface 2.0 SDK 亲密接触 - ScatterView 数据绑定篇
  2. 四、唱歌不如跳舞(上)
  3. 如何在servlet刚启动时候获取服务器根目录?
  4. C#中new和override的区别
  5. oracle_home path,ORACLE_HOME迁移后需要设置LD_LIBRARY_PATH环境变量
  6. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...
  7. Java LinkedList boolean addAll(int index,Collection c)方法,带有示例
  8. maven的java web项目启动找不到Spring ContextLoaderListener的解决办法
  9. 每日小记 2017.4.24
  10. nodejs async await promise理解
  11. How to remove k__BackingField from Json data
  12. [Ubuntu] 添加/删除 ppa 仓库
  13. 从DB-Engines看传统数据库生存状况
  14. SQL-26 (二次分组)汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count...
  15. 京东轮播图的原生代码
  16. 【整理】PYTHON代码审查工具
  17. 不写代码,把网站速度优化 10 倍~~
  18. java PDF模板生成并导出(文字、表格、图片)
  19. activated 使用
  20. Android下的弹幕的简单实现

热门文章

  1. linux设置程序循环,linux shell编程学习笔记(7)流程控制之循环结构
  2. java代码的接口_Java代码--简单接口的实现
  3. ajax jsonjar包,json-lib.jar
  4. Linux shell 脚本实例
  5. 系统调用----sandir
  6. 腾讯企业邮箱服务器地址imap端口号,腾讯企业邮箱如何设置IMAP、POP3/SMTP及其SSL加密方式...
  7. 菜鸟学习笔记:Java提升篇12(Java动态性2——动态编译、javassist字节码操作)
  8. matlab excel 新建sheet,MATLAB怎么在保存结果的EXCEL里面添加内容?比如把 'sheet1‘ 改成 ‘已知点’ ,在第一行加上 '已知点' ,'x', 'y' 等....
  9. Spring @Async配置4. 基于@Async无返回值调用 使用的方式非常简单,一个标注即可解决所有的问题: 1 @Async //标注使用 2 public void asyncMe
  10. mysql 报错从 新安装