IoC的基本概念 (读书笔记)

2,IoC的基本概念

在我们自己写的代码中,被注入对象会直接依赖于被依赖对象,但是在IOC的情况下,二者之间通过IoC Service Provider来打交道。所有的被注入对象和依赖对象都会由IoC Service Provider统一管理。被注入对象需要什么,告诉IoC Service Provider,IoC Service Provider就会把相应的被依赖对象注入到被注入对象中。这样就达到了IoC Service Provider统一管理的目的。IOC所扮演的角色就是IoC Service Provider。原来是我们需要什么东西自己去拿,而IOC呢?就是需要什么东西就让别人送过来。如下图所示:

(1)三种依赖注入方式
》构造方法注入(coustructor injection)
构造方法注入,被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IOC容器)知道他需要哪些依赖对象。IoC Service Provider会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。同一个对象是不可能被构造两次的,所有,被注入对象的构造乃至整个生命周期,应该是由IoC Service Provider来管理的。
优点:直观快捷。对象在构造完成之后,就已经进入就绪状态,可以马上使用。
缺点:当依赖对象比较多的时候,构造方法的参数列表会比较长。而通过反射构造对象的时候,对相同类型的参数的处理比较困难,维护和使用上也比较麻烦。而且在Java中,构造方法无法被继承,无法设置默认值。对于非必须的依赖处理,可能需要引入多个构造的方法,而参数数量变动不利于维护。
》setter方法注入(setter injection)
对于JavaBean对象来说,通常会通过setXXX()和getXXX()方法来访问对应的属性,这些setXXX()方法统称为setter方法,通过setter方法,可以改变相应的对象属性。所以,当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。
有点: 他可以在对象构造完成后再输入,随意性比较强。可以被继承,允许设置默认值,有良好的IDE支持,易于理解和使用。
缺点: 对象无法在构造完成后马上进入就绪状态。
》接口注入(interface injection)
如果被注入对象想要IoC Service Provider为其注入依赖对象,就必须实现某个接口。这个接口提供一个方法,用来为其注入依赖对象。IoC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。如图演示了如何使用接口注入为FXNewsProvider注入依赖对象。
public class FXNewsProvider  { 
   private IFXNewsListener  newsListener; 
   private IFXNewsPersister newPersistener;  
   public void getAndPersistNews()  { 
       String[] newsIds = newsListener.getAvailableNewsIds();   
    if(ArrayUtils.isEmpty(newsIds))   {   
     return;  
 }      
     for(String newsId : newsIds)   { 
            FXNewsBean newsBean = newsListener.getNewsByPK(newsId);    
        newPersistener.persistNews(newsBean);   
         newsListener.postProcessIfNecessary(newsId);  
              }  
   }
 }  

FXNewsProvider为了让IoC Service Provider为其注入所依赖的IFXNewsListener,首先需要实现 IFXNewsListenerCallable接口,这个接口会声明一个injectNewsListner方法(方法名随意), 该方法的参数,就是所依赖对象的类型。这样,InjectionServiceContainer对象,即对应的IoC Service Provider就可以通过这个接口方法将依赖对象注入到被注入对象FXNewsProvider当中
这种方法基本处于“退役状态”。
注意:这里实现的接口和接口中声明的方法名称都不重要。重要的是接口中声明方法的参数类型,必须是“被注入对象”所依赖对象的类型。

IOC优点:
1,不会对业务对象构成很强的侵入性
2,具有更好的可测试性,可重用性和可扩展性
3,。。。。。。。。。。。等等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值