您的位置:首页 > 编程语言 > Java开发

SSH专业课学习(一)spring的IOC(控制反转)

2008-09-09 16:13 567 查看
从九月一号起,开始了最后的一学期,三个月以后,就和大专说GoodBye了!

留恋的同时,也要站好最后一班岗!

SSH是这学期的主打,首先一起迈向Spring之旅吧!(声明:帖子包含尚学堂spring视频、MLDN视频、EXPERT.ONE.ON.ONE.J2EE.DEVELOPMENT.WITHOUT.EJB中文版、指导老师贺老师的课件以及博客论坛不计其数,只享受学习快乐,应该不承担什么法律责任吧)

Spring是一个开源框架,核心是一个轻量级的IoC和AOP容器。(什么是容器?就是应用代码的运行框架,说深了就跑题了,其实我也说不深,但容器的核心就是一个工厂,要是再问什么是工厂?就需要去看J2EE模式。这本书我看了好几遍,因为一两遍我这智商不高的人看不懂)。

IOC(Inversion of Control )通过由主动去寻找依赖对象变成被动接收来实现,实现了松耦合(我将再写一篇低内聚、高耦合的文章介绍耦合内聚的)。IoC实现了对象之间依赖关系的转移,在传统实现中,程序之间的关系有程序代码直接操控,控制反转是将控制权由应用代码中转到了外部容器,控制权的转移,即所谓的反转。另外IoC也是一种设计模式,可以用不同的方式来实现。

主要的实现形式有两种:

依赖查找:容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都是使用这种方式。

依赖注入:组件不做定位查询,只是提供普通的Java方法让容器去决定依赖关系。容器全权负责组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造子传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造子参数传入的做法称为构造子注入(Constructor Injection)。

而Spring框架采用依赖注入实现IoC,依赖注入是由容器动态的将某种依赖关系进行注入,即通过使用Spring框架,开发人员将不必在自己的代码中维护对象之间的依赖关系,只需在配置文件中进行设定, Spring会自动依据配置信息来维护对象之间的依赖关系,将被依赖的对象设置给依赖对象。

换句很通俗的话讲,就是少了几个new字,极大的降低了耦合度。

先来几个Demo吧:

package cn.spring.Demo;

public class Test {

/**
* @author 路的尽头
* @version 1.0
* @comment 普通Java程序 Printer和InkBox两个类紧密耦合, Printer类依赖InkBox。
* 要输出彩色需更改Printer类来完成,称Printer类被InkBox类控制。 如何让Printer类拥有控制权(控制反转)?
* 即在不更改代码情况下,可输出黑色或彩色,可通过将主动去找依赖对象变成被动接受。
*/
public static void main(String[] args) {
Printer p = new Printer();
p.print();
}

}

package cn.spring.Demo;

public class Printer {
private InkBox ib = new InkBox("彩虹的颜色");

public void print() {
System.out.println("得到的颜色是 " + ib.getColor());
}

}

package cn.spring.Demo;

public class InkBox {
private String color;

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

public InkBox(String color) {
this.color = color;
}
}

Demo1:

package cn.spring.Demo1;

public class Test {

/**
* @author 路的尽头
* @version 1.1
* @comment 将InkBox对象作为参数给Printer类的构造方法 更改颜色不再需改代码,由主动去找依赖对象变成被动接受 同时,
* Printer类拥有了控制权,代码的修改全部转移到主代码中了,实现了控制反转。
* 但要用激光打印机输出,则需用到硒鼓,显然,控制权不在Printer类, 如何让Printer类拥有控制权,实现控制反转。
*
*
* 注:控制反转方式之一是通过将依赖的对象作为构造方法的参数实现。
*
*/
public static void main(String args[]) {
Printer p = new Printer(new InkBox("蓝天的颜色"));
p.print();
p.setIb(new InkBox("彩虹的颜色"));
p.print();
}

}

package cn.spring.Demo1;

public class Printer {
private InkBox ib;

public Printer(InkBox ib) {
this.ib = ib;
}

public void print() {
System.out.println("得到的颜色是 " + ib.getColor());
}

public InkBox getIb() {
return ib;
}

public void setIb(InkBox ib) {
this.ib = ib;
}
}

package cn.spring.Demo1;

public class InkBox {
private String color;

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

public InkBox(String color) {
this.color = color;
}
}

Demo2:

package cn.spring.Demo2;

public class Test {

/**
* @author 路的尽头
* @
*
* 注:控制反转方式之二是通过setter方法实现
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
IType type=new InkType();
type.setType("彩色墨盒");
Printer printer=new Printer();
printer.setType(type);
printer.print();
System.out.println();
type = new LaserType();
printer.setType(type);
printer.print();

}

}

package cn.spring.Demo2;

public class Printer {
private IType type;

public IType getType() {
return type;
}

public void setType(IType type) {
this.type = type;
}

public void print(){
System.out.print("使用"+type.getType()+"输出");
}
}

package cn.spring.Demo2;

public class LaserType implements IType {
private final String PRINT_TYPE="硒鼓";

public void setType(String typeName){

}

public String getType(){
return this.PRINT_TYPE;
}
}

package cn.spring.Demo2;

public interface IType {
public void setType(String typeName);
public String getType();
}

package cn.spring.Demo2;

public class InkType implements IType {
private String type;

public void setType(String typeName){
this.type=typeName;
}
public String getType(){
return type;
}
}

对IOC的理解或者是解释,我就这水平了,毕竟是第一次写这种技术型文章,好锻炼语言组织能力啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: