您的位置:首页 > 编程语言 > Java开发

Spring(1)IOC/DI

2016-05-31 09:09 337 查看
前言

        在传统的Java SE程序设计,当一个对象涉及到其他对象或者资源的引用时,我们通常会采取直接在对象内部通过new()方法去主动创建依赖的对象。通过这种方式也就会导致当前模块与依赖对象的耦合,伴随着应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,当系统中对象之间耦合度过高时,必将会出现牵一发而动全身的问题,给系统的维护与升级带来很大的风险,为了解决对象之间的耦合度过高的问题,IOC理论也就应运而生。

IOC的理解

        IOC-Inversion of Control,即控制反转,从字面意思上理解,我们需要弄明白3点,一、控制什么?二、谁来控制?三、何为反转?控制,在这里指的是对象的创建及对象之间的依赖,谁来控制,由传统的由对象自己控制转为交给容器控制,这也是反转的意思(正转即对象自己控制)。由此可以看出,IOC不是一种什么技术,主要是一种设计思想。所以,IOC可以定义为:由IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

Spring中IOC的实现:

依赖注入的方式:

(1)设置器注入(Setterr Injection),就是通过JavaBean的set方法。

(2)构造器注入(Constructor Injection),就是通过类的构造器了,带参数的构造器来设置依赖的类实例或属性。

(3)方法注入(Method Injection),这种方式使用的最少,就是通过普通的方法注入了。

在Spring中,最基本的IOC容器接口是BeanFactory ,该接口为具体的IOC容器的实现作了最基本的功能规定,其代码如下:

public interface BeanFactory {

//这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,
//如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";

//这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。
Object getBean(String name) throws BeansException;

//这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根据名字取得的bean实例的Class类型和需要的不同的话。
Object getBean(String name, Class requiredType) throws BeansException;

//这里提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);

//这里根据bean名字得到bean实例,并同时判断这个bean是不是单件
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

//这里对得到bean实例的Class类型
Class getType(String name) throws NoSuchBeanDefinitionException;

//这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);

}
在BeanFactory里只对IOC容器的基本行为作了定义,实际运用中Spring为我们准备好了一系列工厂来让我们使用,当然你也可以实现自己的IOC容器。

DI 的理解

        DI-Dependency Injection,即依赖注入,它跟IOC是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以又提出了依赖注入概念,即组件之间依赖关系由容器在运行期决定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring