zoukankan      html  css  js  c++  java
  • Spring学习-理解IOC和依赖注入

    最近刚买了一本介绍ssm框架的书,里面主要对Mybatis、spring、springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的。最近正在学习中,一边学习一边做一些总结,现在我对这些思想技术还没有达到很深入的理解,所以总结的比较浅显。现在就把有关spring IOC的知识总结一下:

    1.理解IOC和依赖注入

    IOC,就是控制反转:是一种通过描述并通过第三方去产生或获取特定对象的方式。刚开始听到这个名词的时候,感觉很难理解,随着逐渐熟悉,可以简单的理解为,创建对象不需要通过new,而是交给spring容器,那spring容器创建对象并交给你使用的过程叫依赖注入。也就是说spring容器创建对象是通过依赖注入来完成的。

    2.依赖注入的三种方式

    既然spring创建对象是通过依赖注入来完成的,那就要讲到依赖注入的三种方式了。一般来说,依赖注入可以分为三种方式。

    • 构造器注入。
    • setter注入。
    • 接口注入。

    构造器和setter注入是主要的方式,接口注入是从别的地方注入的方式。

    2.1 构造器注入

    原理:构造器注入是依赖于构造方法来实现的,大多数的情况下,我们是通过类的构造器来创建对象的,spring是通过反射的方式,通过构造器来完成注入。在配置文件中添加以下配置信息。
    代码如下:

    <bean id="" class="">
        <constructor-arg index="" value="" />
        <constructor-arg index="" value="" />
    </bean>
    

    constructor-arg元素是用于定义类构造方法的参数,index是定义参数的位置,value则是设置参数的值,通过这样的定义spring便知道使用什么样的构造方法去创建对象了。
    这样的注入方式比较简单,但是缺点就是如果构造方法的参数非常多,那么这样的构造方法就会变得复杂,可读性也会得差,所以要考虑其它的方式。

    2.2 setter注入

    setter注入是spring中最主流的注入方式,它利用java bean规范所定义的setter方法来完成注入,灵活且可读性也高。就是消除了构造器注入时出现过多参数的问题,首先把构造器声明为无参的,然后通过setter注入为其设置对应的值,其实也是通过反射技术实现的,
    配置信息如下:

    <bean id="" class="">
        <property  name="" value="" />
        <property  name="" value="" />
    </bean>
    

    通过这样的配置spring就会通过反射调用无参构造器生成对象,同时通过反射对应的setter注入配置值了。这种方式是spring最为主要的方式。

    2.3 接口注入

    这个方式好像不是很常用,所以这里就不做总结了,只是简单的了解一下。

    小结

    以上是对我学习的一些总结,内容不是很专业,所以下面引用其他大神们的讲解

    看大神的讲解

    下面内容来自:http://jinnianshilongnian.iteye.com/blog/1413846

    3.1.1 IoC是什么

    Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

    • 谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

    • 为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

    用图例说明一下,传统程序设计如图3-1,都是主动去创建相关对象然后再组合起来:

    图3-1 传统应用程序示意图

    当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图3-2所示:

    图3-2有IoC/DI容器后程序结构示意图

    3.1.2 IoC能做什么

    IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

    其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

    IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

    3.1.3 IoC和DI

    DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

    理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

    • 谁依赖于谁:当然是应用程序依赖于IoC容器;

    • 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

    • 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

    • 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

    IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

  • 相关阅读:
    Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)
    Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
    程序兵法:Java String 源码的排序算法(一)
    oracle等待事件以及解决方案
    记一次数据库参数compatible降级[转]
    R中统计假设检验总结(一)
    Kriging插值法
    数学建模小练习(1):插值【转】
    C++11 lambda表达式
    C++11 正则表达式——基础知识介绍
  • 原文地址:https://www.cnblogs.com/black-spike/p/7648164.html
Copyright © 2011-2022 走看看