Sping 框架的核心就是IOC控制反转和DI依赖注入,并通过这两方面实现松耦合。
(1) 使用Ioc,对象是被动的接受依赖类,而不是自己主动去找。容器在实例化的时候主动将它的依赖类注入给它。
亦可以这样理解:控制反转将类的主动权转移到借口上,依赖注入通过xml配置文件在类实例化是将其依赖注入。
(2) 从UML查看java对象之间的关系即是依赖。
例如:比如a对象依赖于b对象,那么a类中就会有b类的引用(简单理解就是拥有b类的这么一个属性),也就是说a对象要想执行一个完整的功能,
必须建立一个前提——a对象中的b类属性已经实例话,并且拥有b类的一切功能;现在可以去了解什么是依赖注入了,就像前面说过的,a对象想完
成一个完整的功能,要先为自己的b类属性实例化,而在MVC模式中,这种现象很常见,为了简化这种实例化的工作,spring容器就产生了,它可以
统一管理这种实例化频繁的操作,就是说这种本来应由自己实例化的工作交给Spring容器去控制了,也就是说控制反转了,实现的方案之一是在上
述a类中提供一个关于b类的setter方法,这个方法会被Spring容器控制。
(3) 从代码角度看实例:
假设有一个需求,类Business需要调用类DependencyClass的方法doMethod(),
按照日常的做法,得到如下代码示例:
//*类DependencyClass
publi class Dependency{
public void doMethod(){};
}
//**类Business
public class Business{
DependencyClass obj;
public Business(){
obj = new DependencyClass();
}
public void doSth(){
obj.doMethod();
}
}
先将Business里的DependencyClass实例的获得改为setter方式,
其次,将DependencyClass 类改为某个接口的实现,故有如下代码:
//**接口IDependency
public interface IDependency{
void doMethod();
}
//**类Dependency
public class DependencyClass implements IDpendency{
public void doMethod(){......}
}
//类Business
public class Business{
Idependency obj;
public Business(){}
public void doSth(){
...
obj.doMethod();
}
public void setObj(Idependency d){
this.obj = d;
}
}
代码中可以看出:
(1) Business的变量obj可以接受任何IDenpendency的实例
(2) DependencyClass 的实例不是通过Business自己new出来,而是通过setter来由外部传给它。
此时考虑Business依赖的实例如何从外部注入,就要通过xml定义,spring容器再依据xml来实例化。
创建一个spring-context.xml
<beans>
<bean id="dependency" class="*****.DependencyClass"> 实体类名包
<bean id ="business" class="****.Business">
<proproty name="obj">
<ref bean ="dependency"
</property>
</bean>
</beans>
这里的配置文件将DependencyClass类和Business类加入,并将DependencyClass作为Business的一个 参数。
容器加载通过xml来实例化相关的bean.
通过上面不难发现:
(1) Business 是通过接口IDependency来接受DependencyClass实例,所以
当我们又有新的IDenpendency的实现是,只需要修改xml文件即可,
通过上例可以总结出:
a. 依赖类是通过spring容器解析xml后来注入的,而不是使用它的类(Business)来自己制造,这就是依赖的注入。
b. Bussiness 对类Dependency 的依赖转移到对接口IDependency的依赖,控制权由类转移到了接口,即由"实现"转移到"抽象"中。
c. 通过将对实例的依赖,改为对接口的依赖。是面向接口编程的一个要义。也是程序解耦的一个措施。
分享到:
相关推荐
“IOC容器与DI依赖注入示例”文章提及
其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的...
该项目实现了简单的IOC技术思想和DI依赖注入
IOC与DI的理解及使用 控制反转IOC(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法 。... 在Spring中实现控制反转的是IOC容器 ,其 实现方法是依赖注入 (Dependency Injection,DI)
spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和...
本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...
我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,必须掌握反射的实践方法。Java反射机制是在运行状态中,对于...资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。
spring dom4j 解析 依赖DI注入 ioc 反转 反射原理 反射技术
基于XML的依赖注入测试程序,配合博客资源学习。是基于XML的依赖注入方法的测试程序!
理解什么是IoC和DI。 理解构造注入 理解不同数据类型的注入方法 掌握p命名空间注入 Bean自动装配
Spring与IoC系列四:基于注解的依赖注入。对于DI使用注解,将不再需要在Spring配置文件中声明Bean实例。Spring中使用注解,需要在原有Spring运行环境基础上再做一些改变
源代码 博文链接:https://danielkwo.iteye.com/blog/40945
1. 软件系统在没有引IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者 2. 软件系统在引IOC容器之后,这种情形就完全改变了,如图2所示
技术分享:详解Spring基于Annotation的依赖注入实现
理解好它的关键在于我们需要回答如下四个问题:谁控制谁控制什么为何是反转哪些方面反转了在回答这四个问题之前,我们先看IOC的定义:所谓IOC,就是由SpringIOC容器来负责对象的生命周期和对象之间的关系上面这句话...
2、SpringIOC体系结构 3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理...
DI(依赖注入) – 问题的提出: 之前所说的IOC,其中没有提到,如果当spring保存的类中有其他属性需要赋值的话怎么办(其实可以用工厂模式来完成),所以今天我们就来解决这个问题。 – DI的概念: 当spring容器...