前些天,参与了公司内部小组的一次技术交流,主要是针对《IOC与AOP》,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更直观的来学习与理解IOC!也作抛砖引玉之用。

(虽说故事中的需求有点小,但看客可在脑海中尽量把他放大,想象成一个很大的应用系统)

一、IOC雏形

1、程序V1.0

话说,多年以前UT公司提出一个需求,要提供一个系统,其中有个功能可以在新春佳节之际给公司员工发送一封邮件。邮件中给大家以新春祝福,并告知发放一定数额的过节费。

经分析,决定由张三、李四和王五来负责此系统的开发。

其中:由张三负责业逻辑控制模块 LogicController的开发,此处简化为UT.LogicController.exe ;由李四负责祝福消息管理类(GreetMessageService),并集成到组件 UT.MessageService.dll中;由王五负责邮件功能帮助类(EmailHelper),并提供组件 UT.Email.dll。

类依赖关系如下:

王五邮件功能模块核心代码如下:

public class EmailHelper
{public void Send(string message){Console.Write("Frome email: " + message);            }
}

李四消息管理模块核心代码如下

public class GreetMessageService
{EmailHelper greetTool;public GreetMessageService(){greetTool = new EmailHelper();}public void Greet(string message){greetTool.Send(message);}
}

张三业务集成模块核心代码如下:

string message = "新年快乐!过节费5000.";
MessageService.GreetMessageService service = new MessageService.GreetMessageService();
service.Greet(message);

三人经过一个月的艰苦奋战,终于大功告成,系统也在春节其间成功发出问候信。企业如此关怀,给员工带来无比的温暖,因此深受全体员工好评!

春节过后,相应的功能也移植到了与“UT公司”相关的“UT编辑部”和“UT房产”类似的应用当中,并在后继的“元宵”、“端午”、“中秋”等节日中得以广泛应用。

又是一个年关将至……

说真的,过节费的多少,有时可能直接影响整个假日的行程安排、从而影响假日的整体质量,因此部门领导高度重视。而邮件通知的方式,在边远山区常常因为受网 络环境的影响而无法正常收取,许多在外过年的同事对此颇有微词。后经多方考证,决得采用当下非常主流的电话语言播报的方式进行通知。

于是乎,张三、李四、王五又忙起来了。但李四,却有点头疼了,因为他的模块现在不仅在“UT公司”内部使用,而且还在“UT编辑部”和“UT房产”也都有独立运行。如何让此处变化影响最小,就得费点脑筋。为了达到较好的效果,李四决定按以下方式进行整改。

    ①、初始设计方案如下:

首先为了能让不同“祝福方式”能有效替换,决定以“面向接口”的方式来进行分离。

同时,让EmailHelper的邮件通知类和TelephoneHelper的语音播报类都实现此接口。核心代码如下:

public interface ISendable
{void Send(string message);
}public class EmailHelper : ISendable
{public void Send(string message){Console.Write("Frome email: " + message);}
}public class TelephoneHelper : ISendable
{public void Send(string message){Console.Write("Frome telephone: " + message);}
}

再者,为了方便兼容新旧产品,要求Controller决定当前采用什么方式进行通信,并以参数方式传给消息管理模块,核心代码如下:

public enum SendToolType
{Email,Telephone,
}

【备注】:上述代码,并不是一个优秀的设计,在后继的优化方案当中将被去除。

public class GreetMessageService
{ISendable greetTool;public GreetMessageService(SendToolType sendToolType){if (sendToolType == SendToolType.Email){greetTool = new UT.EmailV20.EmailHelper();}else if (sendToolType == SendToolType.Telephone){greetTool = new UT.TelephoneV20.TelephoneHelper();}}public void Greet(string message){greetTool.Send(message);}
}

【备注】:上述代码,并不是一个优秀的设计,在后继的优化方案当中将被优化。

最后,业务集成模块结合具体业务需求进行适当的调整,核心代码如下:

string message = "新年快乐!过节费5000.";
GreetMessageService service = new GreetMessageService(SendTool.Telephone);
service.Greet(message);

注:转载于:http://www.cnblogs.com/showjan/p/3950989.html还有更加详细的

转载于:https://www.cnblogs.com/wcyBlog/p/3958453.html

Spring学习总结(2)——Spring IOC的前世今生相关推荐

  1. JavaEE——Spring学习笔记01【Ioc开发的模式】

    JavaEE--Spring学习笔记01[Ioc开发的模式] JavaEE--Spring学习笔记02[Spring和Mybatis的整合] JavaEE--Spring学习笔记03[AOP开发] J ...

  2. Spring学习(四)IOC详解

    本文借鉴:Spring学习(特此感谢!) 一.简介 概念:控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式.(被动创建) 优势: ...

  3. spring学习笔记(spring概述和IOC)

    spring5 1.spring的概述 1.1.spring是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的. Spring 的 ...

  4. Spring学习笔记 之 Spring<全>

    开始学习Spring全家桶 文章目录 1. IoC 定义 为什么叫控制反转? 实现 IoC 容器创建 bean 的两种⽅式 IoC DI 特殊字符的处理 Spring 中的bean创建类型 -- sc ...

  5. [spring学习] 1、spring下载与使用

    目录 spring介绍 spring核心部分 spring的下载 idea使用spring 总结 spring介绍 Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Jo ...

  6. Spring 学习之 二----Spring创建对象的三种方式

    最近在系统的学习Spring,现在就Spring的一些知识进行总结. 我们知道Spring是一个开放源代码的设计层面的框架,他主要解决的是业务逻辑层与其他各层之间松耦合的问题. Spring 有三个核 ...

  7. Spring学习9-MyEclipse中Spring工程使用@Resource注释的问题

    在MyEclipse 的Spring工程中,有时候要使用@Resource注释来驱动Spring配置.但是在MyEclipse添加Spring开发能力的操作中,并没有 把相关的库添加到工程的class ...

  8. Spring学习笔记之Spring Web Flow

    Spring Web Flow 是Spring MVC 的扩展,它支持开发基于流程的应用程序.它将流程的定义与实现流程行为的类和视图分离开来. 1.配置Web Flow 在Spring MVC上下文定 ...

  9. Spring学习笔记1:IOC本质和依赖注入

    文章目录 1.IOC本质 1.1.拓展:关于Spring Boot 和 Spring Cloud 2.HelloSpring 3.IOC创建对象的方式 4.Spring配置 4.1.别名 4.2.Be ...

  10. Spring学习笔记:2(IOC装配Bean之xml方式)

    xml配置方式装配Bean 本文借鉴于:https://www.cnblogs.com/qdhxhz/p/6511887.html Spring框架Bean实例化的方式提供了三种方式实例化Bean 构 ...

最新文章

  1. NDK 提示undefined reference to xxx“的解决办法
  2. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!...
  3. Error response from daemon: Conflict. The container name /mysql is already in use by container
  4. python学全栈还是运维_Python全栈学习——Python基础及Web开发
  5. 文本序号添加/移除工具
  6. OllyDBG 入门
  7. java中递归算法_java中递归算法是什么怎么算的?
  8. 二极管整流电路工作原理图
  9. 基础知识之存活探针(Liveness Probe)
  10. 腾达ap设置说明_腾达(Tenda)F6无线信号放大模式(Client+AP)设置教程 | 192路由网
  11. oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...
  12. 2019小程序发展趋势
  13. 解决iOS UITableView分组header悬浮,每个section header上面有一段空白间距
  14. mysql查询周边商铺_基于Mysql5.7实现查找附近的店铺
  15. 1月13日科技资讯|苹果官网以旧换新价格暴跌;戴威退出 ofo 法人代表及高管;TensorFlow 2.1.0 发布
  16. firefox插件.xpi
  17. STM32F407基础总结系列(一)
  18. 【推荐】javaweb JAVA JSP 快递信息管理系统物流快递网站物流管理系统源码邮件管理网站
  19. 人工智能Python有哪些应用方向?
  20. android刷新媒体存粗,紫光展锐6款芯片适配安卓11 刷新展锐适配Android速度记录

热门文章

  1. 6间企业获颁“首届粤港澳大湾区百强企业传承大奖”
  2. 软件测试(三)——lab 1
  3. spring security3.x学习(3)_初探过滤器机制和auto-config用法
  4. 云主机前景几何,风萧萧兮!
  5. USACO_Prime Cryptarithm
  6. d3d11 indirect lighting
  7. Asterconference Asia 2012 中国大会
  8. PATH与CLASSPATH的区别
  9. 基于Spark UI性能优化与调试——初级篇
  10. window开机 关机 记录日志