IOC(Inversion of Control)即控制反转技术,其基本原理是基于所谓Hollywood模式思想:Don't call me , I'll call you!思想。也就是说,所有的组件都是被动的,所有组件初始化和调用都有容器负责。组件处在容器当中,有容器负责管理。
举一个例子,公司有一台联想的打印机负责公司内部财务数据打印服务。于是建立一个pringService类。
pactage test;
public class printService {
private Printer lenovoPrinter;
public PrintService() {
this.lenvoPrinter = new Printer();
}
public void printInfo(String info) {
this.lenvoPrinter.init(); //初始化打印机
this.lenovoPrinter.print(info); //打印
}
}
这样如果我们需要打印数据,则这样引用打印机服务:
public class FinanceReport() {
public FinancePrport() {}
public void printReport (String info) {
PrintService ps = new PrintService ();
ps.printInfo(info);
}
}
但是,这样的话如果公司业务量增加,于是有购买了一台 HP 打印机。那么为了支持多台打印机的情况,就需要对打印机服务类作改动。
package test;
public class PrintService {
private Printer thePrinter;
public PrintService (Printer thePrinter) {
this.thePrinter = thePrinter;
}
public void printInfo(String info){
this.thePrinter.init();
this.thePrinter.print(info);
}
}
但是这样就导致了原来的FinanceReport不可用,需要改动
在FinanceReport代码中需要在new PrintService ();作出改动已指定打印机类型;但是这里只是一个FinanceReport(财务打印),如果公司有很多类型的数据需要打印,那么就会有很多的和FinanceReport一样的类,那么就需要逐个改动,很是麻烦,而出现这个问题的原因就是FinanceReport类对printService类的耦合太紧,依赖太深。
下面给出解决方案:
package test;
public class FinanceReport {
private PrintService printService;
public FinanceReport(){}
public void printReport(String reportInfo){
printService.printInfo(reportInfo);//打印
}
//需要时动态的设置它
public void setPrintService (PrintService printService){
this.printService = printService;
}
}
上述代码很大的一个改动就是没有直接的: new PrintService();而是需要时在外部动态的设置它,这样就消除了FinceReport类和PrintService类的强耦合;
下面再来分析FinanceReport类,有上面的分析知道我们为了实现解耦,而动态的设置PrintService,但是我们并不知道是如何得到Service实例的,也就是说Service的Dependency(依赖)在那里我们无从知晓,但是我们可以知道Service完全可以满足我们的需求,因为Service是PrintService类型的。那么谁应该具体负责提供Service的Dependency呢?这就是IOC容器的责任了。IoC容器的责任就是负责向应用程序中提供Dependency的。经过上面的改变,获取服务的依赖性的责任就由用户代码转移到容器中了,这就是责任的迁移。结合上面的“Don't call me,I'll call you”的原则,就可以理解。这样做的优点非常多最核心的一条就是大大降低了代码的耦合度。
声明一下上面的例子是来源于清华大学出版社出版的J2EE应用框架设计与项目开发,作者:余浩东
分享到:
相关推荐
Java-Spring-SpringIoC容器-SpringIoC的学习 SpringIoC容器的学习笔记 主要介绍了IoC容器工作原理以及如何配置IoC容器 通过标签和注解配置容器
《Spring技术内幕》学习笔记1——IoC容器体系结构 《Spring技术内幕》学习笔记2——IoC定位Bean定义资源 《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件 《Spring技术内幕》学习笔记4——IoC容器...
在我们使用Spring.NET框架的时候,首先需要实例化Spring.NET容器, 然后调用IoC容器IObjectFactory接口中GetObject方法获取容器中的对象。通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明...
依赖注入:Dependency Injection IOC的作用:降低程序间的偶合(依赖关系) 依赖关系的管理:以后都交给spring来维护 ... ref:用于指定其他bean类型数据,它所指的是在spring的IOC容器中出现的bean
在自学Spring Framework 开发参考手册2.5时做的学习笔记,其中在遇到手册上不能理解的地方的时候,在网上找了一些比较好的文档也放在了里面。
Spring.NET学习笔记:资源有源代码程序及文档说明,基础篇、应用篇、扩展集成、企业架构体系实战等;基础篇包括:控制反转,环境搭建,实现简易IOC框架,对象的创建,容器中对象作用域,依赖注入,依赖对象的注入,...
Spring 的核心是个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器、非侵入性(No intrusive)的框架,并提供AOP(Aspect-oriented programming)概念的实现方式,提供对...
Spring是一个轻量级的DI/IoC和AOP容器框架。存在的目的是用于构建轻量级的J2EE应用。 轻量级:应用大小和应用开支,包括应用方式 依赖注入DI/IoC控制反转:提供松耦合的一种实现技术 AOP面向切面编程:(可以在不...
Spring是一个开源的控制反转(Inversion of Control , Ioc)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.
Spring 是由 Rod Johnson 撰写,并在其著作 Expert One-on-One: J2EE Design and Development 中有提到过,它是个轻量级(Lightweight)容器(Container)、实现 IoC(Inversion of Control)、AOP(Aspect-oriented...
学习笔记 IOC 和 DI 的概述 IOC(Inversion of Controll) 思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送...
Java 学习笔记测试用例 如果没有特别说明,测试代码默认放在 test 目录下面 模块及功能介绍 Module 功能 spring-aop Spring AOP 面向切面编程 spring-ioc Spring IOC 控制反转(类[对象]交由Spring容器管理) ...
Java学习笔记清单【JVM】JVM相关知识已整理至开源项目:【JavaSE】【Java设计模式】Java设计模式相关内容已整理至开源项目:【Spring】Spring-注解开发Spring-IoC容器-源码解析【SpringBoot】SpringBoot-自动配置-源码...
此存储库包含有关对Spring Framework(v5.2.x)和Spring Boot(v2.4.x)的源代码进行分析的学习笔记。 我试图使这些注释尽可能地易于理解,因此,我主要将这些注释组织成图表,并结合一些微小的代码片段,以使说明...
"spring课堂笔记.docx" 是一份关于 Spring 框架的课堂笔记,它提供了对 Spring 框架的深入理解和学习资源。以下是对这份课堂笔记的大致描述: "spring课堂笔记.docx" 是一份详尽的学习材料,旨在帮助开发者掌握 ...
第一个Spring程序、IOC容器的类型、数据装配 bean生命周期、实例化bean的方式和时机、bean的作用域、继承配置 .自动装配、FactoryBean、两种后处理器 二、Spring AOP AOP简介、实现原理、代理技术 Spring AOP的配置...
内置IOC容器 PageModel构造函数注入 模型中可用的基本方法,例如Alert 内置用于SimpleNavigation,选项卡式和MasterDetail的导航类型 笔记与标准命名约定不同,FreshMvvm使用Page和PageModel代替View和ViewModel
现阶段,EJB是复杂的,它不是为了复杂而复杂。... 简单地说,Spring是一个轻量级的IoC和AOP容器框架。也许这个描述并不简单,但它确实概括出了Spring的功能。为了深入了解Spring,让我们把这个描述分解开来。
学习杂记 松的成长之旅 2020.05.25突发奇想,想要记录一下自己在开发路上的成长过程并有了第一篇笔记MySql优化建议的原因 2020.05.26更新一下使用...2020.07.10更新了IOC容器相关知识 2020.09.02更新了Redis相关知识
VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...