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

        从九月一号起,开始了最后的一学期,三个月以后,就和大专说GoodBye了!

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

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

        

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

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

主要的实现形式有两种:

    依赖查找:容器提供回调接口和上下文环境给组件。EJBApache 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的理解或者是解释,我就这水平了,毕竟是第一次写这种技术型文章,好锻炼语言组织能力啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值