`
AquariusM
  • 浏览: 144093 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

IOC容器学习笔记

阅读更多
      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的学习

    Java-Spring-SpringIoC容器-SpringIoC的学习 SpringIoC容器的学习笔记 主要介绍了IoC容器工作原理以及如何配置IoC容器 通过标签和注解配置容器

    Spring技术内幕学习笔记.docx

    《Spring技术内幕》学习笔记1——IoC容器体系结构 《Spring技术内幕》学习笔记2——IoC定位Bean定义资源 《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件 《Spring技术内幕》学习笔记4——IoC容器...

    Spring.NET学习笔记-实现一个简易的IoC框架

    在我们使用Spring.NET框架的时候,首先需要实例化Spring.NET容器, 然后调用IoC容器IObjectFactory接口中GetObject方法获取容器中的对象。通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明...

    Spring_IoC入门笔记.md

    依赖注入:Dependency Injection IOC的作用:降低程序间的偶合(依赖关系) 依赖关系的管理:以后都交给spring来维护 ... ref:用于指定其他bean类型数据,它所指的是在spring的IOC容器中出现的bean

    Spring自学笔记-Ioc(控制反转)容器

    在自学Spring Framework 开发参考手册2.5时做的学习笔记,其中在遇到手册上不能理解的地方的时候,在网上找了一些比较好的文档也放在了里面。

    Spring.NET学习笔记

    Spring.NET学习笔记:资源有源代码程序及文档说明,基础篇、应用篇、扩展集成、企业架构体系实战等;基础篇包括:控制反转,环境搭建,实现简易IOC框架,对象的创建,容器中对象作用域,依赖注入,依赖对象的注入,...

    spring培训学习笔记

    Spring 的核心是个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器、非侵入性(No intrusive)的框架,并提供AOP(Aspect-oriented programming)概念的实现方式,提供对...

    spring项目开发学习笔记

    Spring是一个轻量级的DI/IoC和AOP容器框架。存在的目的是用于构建轻量级的J2EE应用。 轻量级:应用大小和应用开支,包括应用方式 依赖注入DI/IoC控制反转:提供松耦合的一种实现技术 AOP面向切面编程:(可以在不...

    Spring - 学习笔记

    Spring是一个开源的控制反转(Inversion of Control , Ioc)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.

    良葛格 spring学习笔记

    Spring 是由 Rod Johnson 撰写,并在其著作 Expert One-on-One: J2EE Design and Development 中有提到过,它是个轻量级(Lightweight)容器(Container)、实现 IoC(Inversion of Control)、AOP(Aspect-oriented...

    java查看sun包源码-learning-spring:Spring框架讲解

    学习笔记 IOC 和 DI 的概述 IOC(Inversion of Controll) 思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送...

    JavaLearnProject:Java 学习笔记测试用例

    Java 学习笔记测试用例 如果没有特别说明,测试代码默认放在 test 目录下面 模块及功能介绍 Module 功能 spring-aop Spring AOP 面向切面编程 spring-ioc Spring IOC 控制反转(类[对象]交由Spring容器管理) ...

    java-notes:我的Java学习笔记,存放此处便于移动端复习

    Java学习笔记清单【JVM】JVM相关知识已整理至开源项目:【JavaSE】【Java设计模式】Java设计模式相关内容已整理至开源项目:【Spring】Spring-注解开发Spring-IoC容器-源码解析【SpringBoot】SpringBoot-自动配置-源码...

    spring-learning:我的学习Spring和Spring Boot的笔记

    此存储库包含有关对Spring Framework(v5.2.x)和Spring Boot(v2.4.x)的源代码进行分析的学习笔记。 我试图使这些注释尽可能地易于理解,因此,我主要将这些注释组织成图表,并结合一些微小的代码片段,以使说明...

    spring课堂笔记.docx

    "spring课堂笔记.docx" 是一份关于 Spring 框架的课堂笔记,它提供了对 Spring 框架的深入理解和学习资源。以下是对这份课堂笔记的大致描述: "spring课堂笔记.docx" 是一份详尽的学习材料,旨在帮助开发者掌握 ...

    【2019版】Spring4.3入门视频课程

    第一个Spring程序、IOC容器的类型、数据装配 bean生命周期、实例化bean的方式和时机、bean的作用域、继承配置 .自动装配、FactoryBean、两种后处理器 二、Spring AOP AOP简介、实现原理、代理技术 Spring AOP的配置...

    FreshMvvm:FreshMvvm是专门为Xamarin.Forms设计的超轻量级Mvvm框架。 它被设计为容易,简单和灵活

    内置IOC容器 PageModel构造函数注入 模型中可用的基本方法,例如Alert 内置用于SimpleNavigation,选项卡式和MasterDetail的导航类型 笔记与标准命名约定不同,FreshMvvm使用Page和PageModel代替View和ViewModel

    几个小小的Java案例

    现阶段,EJB是复杂的,它不是为了复杂而复杂。... 简单地说,Spring是一个轻量级的IoC和AOP容器框架。也许这个描述并不简单,但它确实概括出了Spring的功能。为了深入了解Spring,让我们把这个描述分解开来。

    Learning-Miscellany:松的成长之旅

    学习杂记 松的成长之旅 2020.05.25突发奇想,想要记录一下自己在开发路上的成长过程并有了第一篇笔记MySql优化建议的原因 2020.05.26更新一下使用...2020.07.10更新了IOC容器相关知识 2020.09.02更新了Redis相关知识

    asp.net知识库

    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...

Global site tag (gtag.js) - Google Analytics