Spring(1)IOC/DI

前言

        在传统的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是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以又提出了依赖注入概念,即组件之间依赖关系由容器在运行期决定。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值