`
- 浏览:
21075 次
- 性别:
- 来自:
杭州
-
IoC(控制反转),又称DI(依赖注入),是Spring的核心和灵魂。所谓的IoC,当你对Spring有一定了解的时候,可以将它简单的理解为实例的成员注入交由Spring容器控制,或者说成员依赖Spring容器注入到实例中。
那么究竟什么是IoC,首先可以记住一句话,就是好莱坞原则:“Don’t call us, we will call you.”然后我们通过用以下的例子对IoC进行简单说明:
假设我们现在需要做一个关于装配汽车的应用,那么我们就需要一个名字类似于Car的一个类,在这个类中会有诸如wheel(轮胎)、engine(发动机)等成员。
那么在通常的Java应用中,我们一般会这样装配一个Car的实例:
Car myCar = new Car();
myCar.setWheels(…);
myCar.setEngine(…);
…
或者这样:
Car myCar = new Car(Arrays.asList(wheel…), engine, …);
再或者工厂方法等等的方式去初始化一个Car,总之就是将Car中各个成员的装配写在代码中,而Car中的各个成员也是自定义的类,所以也要初始化并加装成员。这样如果代码不经过优化,当我们需要一辆Car的时候就需要从底层到顶层一步步的初始化成员,然后一个个set到对应实例中,代码就会很臃肿。还有个问题,就是当我们要将一辆已经装配好的Car的轮胎换成另一个品牌时,我们就需要找到这个Car初始化的代码,找到轮胎初始化的地方,然后更改代码,如果这种Car在100个地方初始化过,那就会是场灾难,这也就是所谓耦合带来的问题。
说了这么多想到底要说明什么,就是说在一般的简单应用中,类成员的加载,或者说是控制是由代码完成的,一般是由构造器或setter方法完成。而对于Car来说,一辆汽车必须有一个发动机,否则不能称之为汽车,那我们就可以说Car是依赖于Engine类的,Engine可以叫做Car的依赖类。
Ok,现在两个名词各解释了一半了,控制和依赖都很简单理解,那什么叫反转和注入呢。继续上边的例子,我们希望修改的代码尽可能少,并且松散耦合,我们可以先准备一个仓库,里面有各种Engine和Wheel的实现,再将Engine和Wheel类抽象出父类,这样实现方法就可以返回统一的类型,这样在装配Car的时候只要调用仓库内不同的方法就可以直接初始化成员。
好吧这还不够,毕竟我们的Car的初始化还是会分散在各个地方,那么我们为何不将Car的初始化统一起来,工厂方法是一个好的选择,但是工厂方法的接口变动还是会引起很多问题。
其实对于这个应用,我们只关心汽车的各个零件是什么厂家生产的什么型号的零件,至于零件怎么来的,由怎么装上的都可以隐藏掉,那么我们能否只对一个类似于配置单的东西做文章而不关心底层实现。
答案是可以的,这也正是Spring IoC所做的事情,而IoC中的反转就是说上述的控制全部交由IoC Service Provider完成,而DI的意思就是依赖的注入由Spring容器完成。
IoC主要有三种注入方式:构造方法注入(constructor injection)、setter方法注入(setter injection)以及接口注入(interface injection)。
前两中在上述例子中已经已经有过说明,至于接口注入就相当于我们最后说的抽象出一个父类,然后根据这个父类注入其子类。只不过这里是根据接口来注入,这样可以避免Java单继承带来的麻烦。不过接口注入的方式并不被提倡,其侵入性(需要实现不必要的接口)使其处于“退役状态”。
构造方法注入和setter方法注入最主要的区别就是对象在构造完成后能否马上处于就绪状态(可以马上使用),其他方面构造方法注入有着更多的缺陷,比如当依赖较多时,构造器的参数列表会很长;而通过反射构造对象时,对同类型参数的处理比较困难,维护和使用上也比较麻烦;而且在Java中,构造器无法被继承,无法设置默认值;对于非必须的依赖处理,可能需要引入多个构造器,而参数数量的变动可能造成维护上的不便。而setter注入就不会有上述问题。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Spring框架中的IOC(控制反转)和DI(依赖注入)是两种关键的设计模式,它们极大地提升了软件的可维护性和可扩展性。控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移...
**二、Spring Ioc容器** Spring Ioc容器是整个Spring框架的基石,它负责创建、配置和管理对象。容器通过读取XML、Java注解或Java配置类等方式,获取对象的定义信息,然后根据这些信息实例化对象并进行依赖注入。 *...
1. **理解IOC概念** 控制反转是一种设计原则,它将对象的创建和管理交给容器(在Spring中是IoC容器),而不是由对象自身负责。这使得代码更加模块化,降低耦合度。 2. **依赖注入** Spring通过依赖注入...
Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...
标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...
在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色与地位。对于Spring的使用者而言,IOC容器不仅是管理Bean(即应用中的对象实例)生命周期的...
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
这是spring_ioc部分的内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...
【SSH进阶之路】一步步重构容器实现Spring的IoC——解决容器对组件的“侵入式”管理的两种方案--服务定位器和IoC容器(九) 【SSH进阶之路】一步步重构容器实现Spring的IoC——工厂+反射+配置文件实现IoC容器(十)
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的编程中,对象会主动去寻找并创建它所需要的依赖。而在IoC中,这个过程被反转,由外部的容器负责创建对象及其...
以下是Spring IOC容器的主要知识点: 1. **Bean的定义**:在Spring中,业务对象被称为Bean。Bean定义包含了创建和管理Bean的所有信息,如类名、属性值、依赖关系等,通常通过XML、注解或Java配置来定义。 2. **...
在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...
**Spring 的 IoC 容器** IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和...
#### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程),这些功能大大...
本案例主要探讨的是Spring框架的核心特性之一——依赖注入(Dependency Injection,简称DI),通常也被称为IOC(Inversion of Control,控制反转)。通过这个小案例,我们可以深入理解Spring如何实现IoC以及属性注入...
在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...