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

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

一、IOC雏形

1、程序V1.0

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

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

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

类依赖关系如下:

aaarticlea/png;base64,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43qPm57bFhbDan2AyG+1axU8i7Lmw/Ga57ueIGMtRgAuis54PB63fdDzL7wy+/dLX3x2pwViyaz7NI9hU3irBtHtFlGt+ztcIuoegP3R0nhRZFk0LSlY3S3rbuI1fwcA2AWh8bzL89ks5m7TWMmiiogsijvW+wMATo/QeO7VYwfXjq/LhzHeeK1GAICTubHvArCZfDiO1oNPAQB2REsjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAElCIwAASUIjAABJQiMAAEk3tt3B8y+8sotyAABwjp2opfHBGxooObnPfvLL8dlPfnnfxQAAWjhR+rv9mSd3XQ6Ajf3CJx7bdxEArpzOeDwe77sQXC2/8XIeERG/9ly555IAAJvSzwwAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktAIAECS0AgAQJLQCABAktDIqbr37Rfj3/32r8b9t//v2m0++PCH8dK9L8TL3/zSGZYMAGhDaORUffDhe/HOu/fj3rdfXLvNN75Txv+7/0fxznv3z7BkAEAbQiOn6m898Xxcv/ZAvPbmvXj9zXsrf3/rL/4k/vB//aeIiPjUU79y1sUDADYkNHKqHn7oZvzsx385IuoWxQ8+/OGRv3/91a/GBx/+MP7Gj306PnbzqX0UEQDYgNDIqTt4/Ln4kb/0aHzvrdfj8Lsvz37/xp9W8dqb9+L6tQfiUz/5D/dXQAAgSWjk1F2/9kD8nZ+su56/8Z1y9vuvv/rViIj4mZ/I4+GHbu6jaADAhoRGzsQTjz4Tj3/06Xj3/bdnv/veW6/HzUcei5/6639vjyUDADYhNHJmfvbjvxzXrz2w9LvPrfwOADh/hEbOzF/5kScie/y52f+ffPSZeOLRZ/ZYIgBgU0IjZ2o6fvH6tQfimY9/bt/FAQA21BmPx+O2D/r9P/5+fOVrr8ab939wGmXiknvix/4wHv7IW3H4+qf3XRQuoEdvfiR+6TNPxrNP//i+i8KGvGfA+XLSevREofEf/av/Hn/25++1fRjMXL/2QXzw4fV9F4ML6sEb12L4z//uvovBhrxnwPlzknr0RN3TXvxsS2BkG++9/+G+i0AL3jPg/DlJPXpj24O+9MVnt90FwEaef+GVfReBLXnPgP3aph41EQYAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAIAkoREAgCShEQCAJKERAK60MnqdTnQ6vSiVg2Nc0tA4vfGafi7qzVjFoLtwHr3NzqIadOeP6Q6iOuVSXgZHnrPJT3dwzp65ahDdTic6nW6ct6LB1bFULzf9nKd6t3W9MT+/Y99ypvs9T+fKqbhkoXF6gx8XDMvoncs32tSL8zCqxTKXgw3OoYxBsbBRVcXh1uW8zOpr0C1Wn9iq6B5faQJX0FK9DJfcJQqNVQy63Zi+32fFKMbj8crPMN9vKbeXRZ5nEVFFeTdRW5VlHZ7zPC78aZ+BanB7cv/kMTxy3wzP3/OX9WM0Hsd4PIp+tu/CcFX9wWu/Fb/3nWG89/7b+y7KnmVRjFbfb8bjcYxH/Tg3L1H1Blu6NKGx7HWPvOGP1rwi8uHFf8FkeR5ZRFTl3WO7AsqyjIgsiv65izzn0uGkySAr+kshsb6nLv4HDtitP3rjt+Mb3ynjxf/2T+Lwuy/vuzjAKbscobEaxKCMqD/tnaRVaDIGsjuIammMykqX5GxMyIbjCzfYvuzVY0ymraT1/48ZS3dwK+rGxmJy3s3HHZQRkeVxKxWQW53T6njR5vF+m27XPCbouKd08fnZaMxq22vWxsb7Pv4em42jXFeulTFDqQHjTeN612x7ms8Pl9rPP/35+Ks/msW7778dv/Ot34x///XPxxt/qr92relrbfL6Wq7LFl92y2Or14+rblOH7mmiybZ1zNLztjLufMv34FqLHHCFXYrQWN0t6zfSvL9lC+LRLu6Vvw660ekWq617Za9xAHDb7TeXxa28PtG6NbGhrJPnJMtvHds10qqM1SC6DZXNyni/Tbcre0fC8tHDN1WS9Qu5XV2z+fkdZNmknIONKtSTXd/meyy7Vbcez4YULD9qeo8fHKS7usremjeFMnpL5Tq9e5Sr4OYjj8Xf/0QRP//05+Phh27G9956Pf7j7xXx8je/FG/9xZ/su3jnWB1QluuysteJXtk8troquqt1Yus69Oztto45bB53XvYag+Au62hqlyI0zroVs4PtdlSVUVZHx0POuiSrQdwuqlgd7zaKYtLqd3vxBdpi+2mXeTFJA/X/65913exZf9KF2hgyphNg8ugfl6JbnlM5qF98R8eLzsvddrupxfMdj8cxKprD27oxh9NrVB9voaW55fnNntNJhX5shdv2fpg9bs09lk1aj6OM1c8BVdwtq9hsqEEZvWnlmQ8bn9etzwGWPPHoM/G5n/u38TM/kcf1aw/Ea2/eizu/+0/j3rdfvCLjHasommZRrwsmk3p7Xg/M68fZUKuF1++0jlv3gXbTOvTM7bqOKYsolurP8fTJKXsrjRc7raOJiIgb+y7A9qo4nEwJPjhYfVPsNn3KiDyGayY3ZMWoMajVQaip+zuL/p0iym5RjzHsZ5GdYPv28sjzuqVxMKgiXyzzhhNgTlbGLPIj/d1Z9Efjhr1vsF0+jHHDQ7N+P/KiF2UcxmGdlSJi/uEgHx4tb94vIitXy9r+/Or7ojdppauKbnSKSTmXao1trm/zPVa3HhdVVbce5wt7re5GnRnTQw2qweRNIititFTmrD+KcX8357BPn/3klyMi4jde/vKeS8JxPvjwh/EHr/1WvPrGf42/9uhPxf9+8zzdRfuXDxfDyMJrLlbriHw4jLyzWie2rUO3UfY60Wn7mJ3XMVkUo6U5CfkwhnndartYd+6+jibikrQ0tjd5Ia1Y1zI3DabrPk0uB9O2259MPnlxLE+I2WwCTPsy1t23VRTd45cs2nS7Y/YQ2dav15Neg8mn0lExr0hWunu3ub7rW3/XdVFvOtQgYqHVPbnt2dyj8M679+NH//Ib8dAD7+y7KKdozezpdTOnsyJWqufsIOq+sqY6om2duIs6dFunUMes+eA8fS+Mw8PJPk+njuZStDTOHS5/pMr6MVpsWoly1orUcs8t1+I6o7W78jzyKKOsyrhb9etKYuMJMO3LmPVHMazqMTdFtxNFNH8i23S7qXocT/r4B1kWUVZRDgZR5f2lFsVYGu+35TWY3juzsTL1eMDRqB/ZaV3f7FbkWRFVVXdR1/XgvGs6T89oWt/qvuLiri/3n//nP46IiJe++OyeS8Ky77/1evyPV786mwzzsZtPxaee+pX4tX/9f/Zcsstt0zp0G0dbRpc09uqdYR1zkEUW5cLxL279dt5dgpbG+aSQqjrtpauPWYur8VNl2+3byqNfD86YrdnYplXqJGVcHn9ZFd3GbxfYaLvJrLZNK7usf2c2FmVxNlz9+HUtq1teg3w4b3Wsyji6NOaur2/DBKcWXdMnc9r3KFfBO+/ej9/51m/G3cns6Ycfuhk/9zd/NZ5/5l/Ex24+te/iXV4t69D92Gcdo37btUsQGiOyg8kEmI2+JeUkpk39VWyWS9tuf3LTLs16wPOGE2C2LmM9PnE+QLiK4nbTgO/jt5u1EGbFZMHZ4yfNTAeIZ8v9LlkRo5W1N3d4DWbdRqew7+VDLXVRt/sQkMX0pXDYPP5iwdndo1xe03GLw9/9Z3H43Zfj+rUH4m8/+Q/i9qd/PQ4ef27fxbv02tahZ+sM65jDaun9R/12Wi5FaIy8P3mBVFF0T2P9qfmb8bolbrbbfguLs257bb4BZjdlnE1KSXxF4ep2067ULIo7m3zam8wqzoq4Mxpt8Glxh9egOlw6t1O8vkdmUbfpmq7Nlg1KLPx+pvcol9Z/+ea/jHvffjHeff/tePyjT8etT30pnvn45+LBG4/su2hXQNs69KydQh2z0ttzdP/zD9fqt9NyOULjZDbUpGNv/XIpa9bA28RsoG3Za9j36jHbbn/ym3y1SzPP05GxfRmbn9f5bN1s0hq36Xazv0RxZIXydWtk1bPF11UaW5/fpJuncbvpWJ2FLuL213dTC9dzcLt11/SspbIqorvUZ1WvWTZv6T29c+CquHHtwbj5yGPxiz/9hfjFn/5C3HzksX0X6QratA49e7uvY+px8suLoE+HKC1+uFa/nY5LEhpjMnFhPrW+HkO3bhX4g0jOE1iWDxfWylred0PrZtvt4+hNnv4WgLn5+oLRPCtvV+fUsN10kdW8f/STbnq7LPr91fNdt1BtXdxh5OtmwzWN69nB+c23y2O42KJ5gn1vanY9q6rl+NSIyPpxZ77gW+M1mDnFc+BqeO7pz8ftT/96PP7Rp/ddlD1bXy+d3iL57evQM7frOiabLGnXW63XsuJOw1I8Ozw2EXGZQmNENC6XcsR0UOxJvmpwMrmjcd/1fpdnB7fdfvEmn263WbdkPlvWr1XAaFXGdWtbLn8v86bbReP6h9Pjrs7Sq2KQGHpQ9la/Hmrj81v60LG0k8Z7pvX13Vi+sExj++Ufsv5oTbmWgm+c5jnAVbDnpW1a1aH7sds6Jo87DYtt58Pm/ajfdq8zHjctDXq85194ZfZvy15wJmZL36wJpbMlH9Yv3M7Fp+65mFw3tjKt37NisuwZ29jm9XjJWhq59FbGRNZm38285u8AwHaERi6G6YzwpTUaj45rOa+zCAHg4hMauSAaxkQe+fMwxitrNQIAu3KpvkaQyy8fjqP1IFwALq6VrwRmX7Q0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJAkNAIAkCQ0AgCQJDQCAJB0Y9sdPP/CK7soBwBXgPcMuLhO1NL44A0NlABsxnsGXA4neiXf/syTuy4HwMZ+4ROP7bsItOA9A86fk9SjnfF4PD6FsgAAcInoMwAAIEloBAAgSWgEACBJaAQAIEloBAAgSWgEACBJaAQAIEloBAAgSWgEACBJaAQAIOn/Ay4AuDv4+QDaAAAAAElFTkSuQmCC" alt="" />

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

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房产”也都有独立运行。如何让此处变化影响最小,就得费点脑筋。为了达到较好的效果,李四决定按以下方式进行整改。

    ①、初始设计方案如下:

aaarticlea/png;base64,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" alt="" />

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

同时,让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还有更加详细的

Spring学习总结(2)——Spring IOC的前世今生的更多相关文章

  1. Spring学习1:Spring基本特性

    http://longliqiang88.github.io/2015/08/14/Spring%E5%AD%A6%E4%B9%A01%EF%BC%9ASpring%E5%9F%BA%E6%9C%AC ...

  2. Spring学习(一)IOC

     Spring是一站式框架: (1)Spring在javaee三层结构中,每一层都提供不同的解决技术. web层:SpringMVC service层:Spring的Ioc dao层:Spring的J ...

  3. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  4. Java架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  5. Spring学习1-初识Spring

    一.简介   1.Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发.  2.为何要使用Spring?   ...

  6. Spring学习十四----------Spring AOP实例

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  7. Spring 学习笔记(2) Spring Bean

    一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...

  8. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

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

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

  10. Spring学习(五)--构建Spring Web应用程序

    一.Spring MVC起步 看过猫和老鼠的小伙伴都可以想象Tom猫所制作的捕鼠器:它的目标 是发送一个小钢球,让它经过一系列稀奇古怪的装置,最后触发捕鼠 器.小钢球穿过各种复杂的配件,从一个斜坡上滚 ...

随机推荐

  1. 25.usb固件深入

    dscr51里放的是USB描述符表,EZ-USB在重枚举阶段会读取或设置相应的描述符: db    DSCR_DEVICE_LEN          ;; Descriptor length db   ...

  2. Ant学习---第三节:使用Ant实现一个最小的项目编译

    1.编译 .java 文件,生成 .jar 包,代码如下: <?xml version="1.0" encoding="UTF-8"?> <p ...

  3. VS2010在C#头文件中添加文件注释的方法

    步骤: 1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\I ...

  4. 【每日scrum】NO.3

    1.感觉需求分析没有想象的那么简单,今天由于某些原因没有完成.

  5. TF-IDF与余弦相似性的应用(二):找出相似文章

    上一次,我用TF-IDF算法自动提取关键词. 今天,我们再来研究另一个相关的问题.有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章.比如,"Google新闻"在主新闻 ...

  6. 如何实现SAP的RFC函数调用(原创)

    连接sap系统需要通过sap javaconnect来连接,对于sapjco.jar系列文件有32位与64位之分[32位用的JAR版本是 2.1.10 (2011-05-10) ,64位用的JAR版本 ...

  7. 17、android设备如何防止屏幕休眠(转载)

    当你需要你的设备需要长期运行时,由于移动设备为了延长电池续航时间,在运行15s-30mins后(用户可自由设置),如果用户在此时间段内没有操作,系统将进入休眠状态并 将屏幕锁上,所以在需要长期运行时, ...

  8. Netsharp快速入门(之16) Netsharp基础功能(权限管理)

    第5章     Netsharp基础功能 5.1     权限配置 5.1.1  功能权限 1.配置权限功能点,打开平台工具-基础业务-操作管理 2.选择资源节点为销售订单,点添加常用操作,添加完成后 ...

  9. 不同系统平台下Java默认的安装路径

    下面以Oracle的JDK7update 51为例: • 32-bit JDK on Windows: C:\Program Files (x86)\Java\jdk1.7.0_51 • 64-bit ...

  10. Basic knowledge of javaScript (keep for myself)

    1. 函数表达式 JavaScript 函数可以通过一个表达式定义.eg. var x = function (a, b) {return a * b}; so: var x = function ( ...