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应用框架设计与项目开发,作者:余浩东
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值