为了账号安全,请及时绑定邮箱和手机立即绑定

你真的思考过IOC容器吗?

2018.06.11 19:59 432浏览
字号
大字 中字 小字

Ioc概念

很多初学者在刚听到Ioc和DI等概念的时候,往往一头雾水,用了很久才理解它们的意思,这里我说一下我对它们的理解。 image.png IOC(Inversion Of Control,反转控制)一般也被理解为DI(Dependency Injection,依赖注入),实际上两者还是略微有些区别,虽然它们经常性的出现在一起。 Ioc是把对象的控制权较给框架或容器,容器中存储了众多我们需要的对象,然后我们就无需再手动的在代码中创建对象。需要什么对象就直接告诉容器我们需要什么对象,容器会把对象根据一定的方式注入到我们的代码中。注入的过程被称为DI。有时候需要动态的指定我们需要什么对象,这个时候要让容器在众多对象中去寻找,容器寻找需要对象的过程,称为DL(Dependency Lookup, 依赖查找)。 按照上面的理解,那么IOC包含了DI与DL,并且多了对象注册的过程。 Ioc是一种设计模式,一种概念,主要包含的内容如下:
  1. 对象的生命周期的管理
  2. 依赖的解析与注入
  3. 依赖的查询
  4. 应用的配置

Ioc的优点

IOC容器给我们提供的最大便利之处就是更容易实现可插拔,可替换的组件。这也是接口驱动开发所带来的优势,根据接口可以提供更多灵活的子类实现,增强代码的健壮性和稳定性。 Ioc管理的组件一般是实现了某些接口的类,这些组件又会使用其它的实现某些接口的组件,它们都不需要知道接口的具体实现,因为这,组件间的替换才会如此容易。容器的任务就是帮我们创建组件的具体事例,并且把管理它们的依赖关系,把所需的具体依赖传给组件。

一个有关Ioc的案例

市场上实现Ioc的容器有多种:像Guice, Spring, Jboss等。 我们使用Spring来做一个案例:
  • 首先下载Spring的lib,添加Jar包依赖
  • 写测试程序
  • // HelloWorld接口与它的实现 public interface HelloWord { void sayHello(); } public class HelloWordImpl1 implements HelloWord { @Override public void sayHello() { System.out.println("hello1"); } } public class HelloWordImpl2 implements HelloWord { @Override public void sayHello() { System.out.println("hello2"); } }
  • 新建Spring配置文件,Spring的配置可以试Java配置,也可以是xml配置,我们使用Java配置。
  • @Configuration public class BeanConfig { @Bean public HelloWord helloWord(){ //我们可以在此处创建HelloWorld的实现,在注入的时候直接指定相应的类就好了 return new HelloWordImpl1(); } }
  • 运行程序
  • public class App { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext("me.aihe"); HelloWord helloWord = applicationContext.getBean(HelloWord.class); helloWord.sayHello(); } } // 运行结果 hello1 //当修改BeanConfig的返回HelloWorld的Bean为HelloWorldImp2时 //运行结果为 hello2 以上是一个简单案例,但是可以稍微由此得出一些Ioc的有点:
  • 在应用代码中,我们无需使用new关键字新建对象。在业务代码中太多的new对象会导致代码耦合度过高。
  • 应用中只需要使用HelloWorld的接口,不用关心HelloWorld接口的实现。我们只是告诉ApplicationContext,我们需要HelloWorld类型的对象,然后就获得了一个对象。
  • 对象关系图:
    对象关系图
    应用无需关心组件,只需要从容器中拿。

    小结

    这里我们提到了Ioc的概念,控制反转,对象控制权由对象本身转向容器;依赖注入,容器管理组件的依赖关系并提供对应的依赖对象。然后说了IOC的优点:
    1. 减少代码的耦合,可以使应用更加模块化
    2. 增加代码的复用率
    3. 资源更加统一管理
    4. 维护代码更加方便,一般只需要修改一下配置文件就ok了。
    5. 提升了程序的测试性
    这里仅仅是个人对IOC的理解,如果想要有更深入的理解,可以查阅更加权威的书籍与资料。

    参考

    1. 控制反转
    2. Ioc有什么好处呢
    本文原创发布于慕课网 ,转载请注明出处,谢谢合作
    1人推荐
    若觉得本文不错,就分享一下吧!
    看过此文的用户,还看了以下文章
    正在加载中
    1. 评论
    2. 收藏
    3. 共同学习,写下你的评论
    意见反馈 常见问题 APP下载
    官方微信
    举报
    0/150
    提交
    取消
    hv128