IoC
IoC: Inversion of Control,控制反转, 控制权从应用程序转移到框架(如IoC容器),是框架共有特性
1、为什么需要IoC容器
1.1、应用程序主动控制对象的实例化及依赖装配
A a = new AImpl();
B b = new BImpl();
a.setB(b);
本质:创建对象,主动实例化,直接获取依赖,主动装配
缺点:更换实现需要重新编译源代码
很难更换实现、难于测试
耦合实例生产者和实例消费者
A a = AFactory.createA();
B b = BFactory.createB();
a.setB(b);
本质:创建对象,被动实例化,间接获取依赖,主动装配 (简单工厂)
缺点:更换实现需要重新编译源代码
很难更换实现、难于测试
A a = Factory.create(“a”);
B b = Factory.create(“b”);
a.setB(b);
<!—配置.properties-->
a=AImpl
b=BImpl
本质:创建对象,被动实例化,间接获取依赖, 主动装配
(工厂+反射+properties配置文件、
Service Locator、注册表)
我想直接:
//返回装配好的a
A a = Factory.create(“a”);
1.2、可配置通用工厂:工厂主动控制,应用程序被动接受,控制权从应用程序转移到工厂
//返回装配好的a
A a = Factory.create(“a”);
<!—配置文件-->
<bean id=“a” class=“AImpl”>
<property name=“b” ref=“b”/>
</bean>
<bean id=“b” class=“BImpl”/>
本质:创建对象和装配对象,
被动实例化,被动接受依赖,被动装配
(工厂+反射+xml配置文件)
缺点:不通用
步骤:
1、读取配置文件根据配置文件通过反射
创建AImpl
2、发现A需要一个类型为B的属性b
3、到工厂中找名为b的对象,发现没有,读取
配置文件通过反射创建BImpl
4、将b对象装配到a对象的b属性上
【组件的配置与使用分离开(解耦、更改实现无需修改源代码、易于更好实现) 】
//返回装配好的a
A a = ApplicationContext.getBean(“a”);
<!—配置文件-->
<bean id=“a” class=“AImpl”>
<property name=“b” ref=“b”/>
</bean>
<bean id=“b” class=“BImpl”/>
本质:创建对象和装配对象、管理对象生命周期
被动实例化,被动接受依赖,被动装配
(工厂+反射+xml配置文件)
通用
IoC容器:实现了IoC思想的容器就是IoC容器
2、IoC容器特点
【1】无需主动new对象;而是描述对象应该如何被创建即可
IoC容器帮你创建,即被动实例化;
【2】不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),
IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;
【3】主动变被动,好莱坞法则:别打电话给我们,我们会打给你;
【4】迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供某类服务的对象(面向抽象编程),松散耦合,一个对象应当对其他对象有尽可能少的了解,不和陌生人(实现)说话
【5】IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。
3、理解IoC容器问题关键:控制的哪些方面被反转了?
1、谁控制谁?为什么叫反转? ------ IoC容器控制,而以前是应用程序控制,所以叫反转
2、控制什么? ------ 控制应用程序所需要的资源(对象、文件……)
3、为什么控制? ------ 解耦组件之间的关系
4、控制的哪些方面被反转了? ------ 程序的控制权发生了反转:从应用程序转移到了IoC容器。
思考:
1: IoC/DI等同于工厂吗?
2: IoC/DI跟以前的方式有什么不一样?
领会:主从换位的思想
4、实现了IoC思想的容器就是轻量级容器吗?
如果仅仅因为使用了控制反转就认为这些轻量级容器与众不同,就好象在说我的轿车与众不同因为它有四个轮子?
容器:提供组件运行环境,管理组件声明周期(不管组件如何创建的以及组件之间关系如何装配的);
IoC容器不仅仅具有容器的功能,而且还具有一些其他特性---如依赖装配
控制反转概念太广泛,让人迷惑,后来Martin Fowler 提出依赖注入概念
Martin Fowler Inversion of Control Containers and the Dependency Injection pattern
http://martinfowler.com/articles/injection.html
DI
2、什么是DI
DI:依赖注入(Dependency Injection) :用一个单独的对象(装配器)来装配对象之间的依赖关系 。
2、理解DI问题关键
谁依赖于谁? ------- 应用程序依赖于IoC容器
为什么需要依赖? ------- 应用程序依赖于IoC容器装配类之间的关系
依赖什么东西? ------- 依赖了IoC容器的装配功能
谁注入于谁? ------- IoC容器注入应用程序
注入什么东西? ------- 注入应用程序需要的资源(类之间的关系)
更能描述容器其特点的名字——“依赖注入”(Dependency Injection)
IoC容器应该具有依赖注入功能,因此也可以叫DI容器
3、DI优点
【1】帮你看清组件之间的依赖关系,只需要观察依赖注入的机制(setter/构造器),就可以掌握整个依赖(类与类之间的关系)。
【2】组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
【3】依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。
使用DI限制:组件和装配器(IoC容器)之间不会有依赖关系,因此组件无法从装配器那里获得更多服务,只能获得配置信息中所提供的那些。
4、实现方式
1、构造器注入
2、setter注入
3、接口注入:在接口中定义需要注入的信息,并通过接口完成注入
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
使用IoC/DI容器开发需要改变的思路
1、应用程序不主动创建对象,但要描述创建它们的方式。
2、在应用程序代码中不直接进行服务的装配,但要配置文件中描述哪一个组件需要哪一项服务。容器负责将这些装配在一起。
其原理是基于OO设计原则的The Hollywood Principle:Don‘t call us, we’ll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和装配都由容器负责。组件处在一个容器当中,由容器负责管理。
IoC容器功能:实例化、初始化组件、装配组件依赖关系、负责组件生命周期管理。
本质:
IoC:控制权的转移,由应用程序转移到框架;
IoC/DI容器:由应用程序主动实例化对象变被动等待对象(被动实例化);
DI: 由专门的装配器装配组件之间的关系;
IoC/DI容器:由应用程序主动装配对象的依赖变应用程序被动接受依赖
关于IoC/DI与DIP之间的关系 详见 http://www.iteye.com/topic/1122310?page=5#2335746
IoC/DI与迪米特法则 详见http://www.iteye.com/topic/1122310?page=5#2335748
分享到:
相关推荐
Spring的核心特性包括AOP(面向切面编程)和IOC(控制反转),以及依赖注入(DI)。以下是对这些概念的详细解释: **面向切面编程(AOP)** AOP是一种编程范式,它允许开发者将关注点从主业务逻辑中分离出来,例如...
在“IocPerformance-master”这个项目中,开发者可能对不同IoC容器(如Autofac、Unity、StructureMap等)进行了性能比较,或者测试了在大规模应用中DI的效率。这样的测试对于理解在实际应用中选择哪种DI框架具有重要...
"IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...
总的来说,这个项目提供了一个从零开始学习和理解IOC、DI和Servlet应用的机会,对于Java Web开发者来说,深入理解这些基础概念对于提升技能和解决实际问题非常有帮助。通过这种方式,开发者能够更好地掌握Web应用的...
在Spring框架中,IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)是两个核心的...因此,理解并熟练应用Spring的IOC和AOP对于提升Java应用程序的质量和可维护性至关重要。
在软件开发中,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,它们对于实现灵活、可维护的代码具有重要作用。这些概念遵循了开闭原则(OCP,Open-Closed ...
标题 "ioc_di (1)" 暗示了我们即将探讨的话题是有关于IoC(Inversion of Control)和DI(Dependency Injection),这是Spring框架中的核心概念。这些概念在软件工程中至关重要,因为它们有助于实现松耦合和可维护性...
标题中的"Spring的IOC和DI的区别"涉及到Spring框架的核心特性,即控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念是理解Spring框架工作方式的关键。 首先,控制...
【Spring核心IOC以及DI】是Spring框架中的关键概念,它们是Spring实现控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)的基石。这两个概念是Spring框架的核心,使得应用程序的...
总之,"spring-demo02-IOC-DI案例"是一个很好的实践平台,帮助开发者深入理解并掌握Spring框架的核心特性,提高代码的可维护性和可扩展性。通过研究和实践这个案例,你将能够更好地应用这些知识到实际的项目开发中。
轻量型框架的特点主要是 Ioc 或称 Dependency Injection (DI),通过 Ioc 模式的使用,所有的 POJO 可以实现最大化的松耦合,具体详情可了解 Ioc 模式/DI。Ioc/DI 是所有轻量框架的一个共同特点,不同的只是具体 Ioc/...
首先,让我们深入理解IoC和DI的概念。控制反转(IoC)是一种设计原则,它将对象的创建和管理职责从应用代码中分离出来,转交给外部容器(在这种情况下是Spring容器)。这样,应用不再负责对象的创建和维护,而是由...
通过了解Spring框架中的IOC和DI概念,我们可以更好地理解Spring是如何帮助我们管理对象生命周期以及依赖关系的。无论是在项目开发初期还是后期维护阶段,合理利用这些特性都能极大地提高工作效率并减少潜在的错误。
通过对Spring的IOC、DI和动态代理的理解,我们可以自行构建一个简化的AOP系统,实现对特定方法的增强,从而达到类似Spring AOP的效果。这种方法对于学习Spring AOP的工作原理非常有帮助,同时也为在没有Spring AOP...
【Java开发学习(二)——IOC、DI入门案例】 在Java开发中,Spring框架的核心特性之一就是Inversion of Control(IoC,控制反转)和Dependency Injection(DI,依赖注入)。这两个概念是紧密相关的,理解它们有助于...
在Java开发中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理交给了外部容器,使得代码...这将有助于提升开发者对Java应用程序设计模式的理解,以及如何利用Spring框架来优化代码结构。
它提供了许多关键特性,如依赖注入(Dependency Injection,简称DI)、面向切面编程(Aspect-Oriented Programming,简称AOP)以及控制反转(Inversion of Control,简称IOC)。在这个“干净的spring初始化工程”中...
【Spring 框架的IOC与DI理解】 Spring框架的核心特性之一是控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念在软件设计中起到了至关重要的作用,它们帮助开发者...
在软件开发领域,IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是两种重要的设计模式,特别是在Java和Spring框架中被广泛使用。这些概念有助于提高代码的可测试性、可维护性和模块...