依赖注入DI/控制反转IoC

        控制反转,也可称之为依赖注入。就我而言,可能依赖注入这个概念 更容易理解一些,通常有三种注入方式,构造函数、工厂方法的参数、设置对象值属性(也就是setter()方法)。
        依赖注入/控制反转。基本原理上因该是对象之间的依赖关系。简化点来理解,就是依赖什么,我就反过来将其注入,而不在被依赖对象里去创建。比如,人(peason类)开车(car类),那么可以理解为peason类依赖car类,可以向下引申到对象,peason类的对象driver依赖于car类的对象truck(卡车)。
通常情况下的代码:
public   class  peason {

      
void driver(){
             car truck 
= new car("truck");
             truck.加油;
             truck.挂挡;
             ……
      }

}
在这里,driver的依赖对象truck由自己创建,耦合度很高。比如,现在司机不开卡车改开拖拉机,那么类peason的代码就需要修改,不易维护。
现在依据依赖注入的原则修改优化一下,代码:
public   class  peason {
     
private car Mycar;
     
public peason (Mycar mycar){
          Mycar 
= mycar;
     }

     
void driver(){
         Mycar.挂挡;
         Mycar.加油;
     }

}
修改成这样,调用方法
    car mycar = new car("拖拉机");
    peason driver = new peason(mycar);
    driver.driver();
至此,一个最简单的构造函数注入便完成了。将要开的车注入进peason类的对象,控制从根本上发生了倒转,这就是控制反转。
当然,还可以用设置值对象的方法,稍微修改上面代码:
public   class  peason {
     
private car Mycar;
     
public peason ()
     
{
          
//Mycar = mycar;
     }

     
void driver(){
         Mycar.挂挡;
         Mycar.加油;
     }

     
public void setCar(car mycar){
         
this.Mycar = mycar;
    }

}
调用,则修改为,
    car mycar = new car("拖拉机");
    peason driver = new peason();
    driver.setCar(mycar);
    driver.driver();

以上是spring的依赖注入的基本原理,但spring更牛X,它提供一个非常成熟的容器来实现IoC。我们可以将需要的依赖关系按spring的规则配置进XML里,通过BeanFactory自动的实现注入过程。
<? xml version="1.0" encoding="GBK" ?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"
>

< bean  id ="myCar"  class ="truck" />   
< bean  id ="peason"  class ="peason" >
    
< property  name ="car"  ref ="myCar" />
</ bean >
在上面bean.xml中,myCar bean的class属性truck为car的实现类,并且,在spring2中,用户可以开发自定义标签,增强了扩展性。

如果这个xml名字为bean.xml,那么调用过程:
ApplicationContext context = new ClassPathXmlApplicationContext(
                        new String [] {"bean.xml"})           //这里支持从多个xml中读取bean定义
BeanFactory factory = new BeanFactory(context);
peason driver = factory.getBean("peason");
driver.driver():
这里是以属性方式注入,还可以用构造器方式注入,由于篇幅问题,详细内容在下一篇笔记中阐述。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值