Spring框架控制反转IOC和依赖注入DI详解

本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。

Spring框架基础参考深入学习Spring基础



一.入门程序和IOC简介

  • 依赖注入或控制反转的定义中,调用者不负责被调用者的实例创建工作,该工作由Spring框架中的容器来负责,它通过开发者的配置来判断实例类型,创建后再注入调用者。
  • 由于Spring容器负责被调用者实例,实例创建后又负责将该实例注入调用者,因此称为依赖注入
  • 被调用者的实例创建工作不再由调用者来创建而是由Spring来创建,控制权由应用代码转移到了外部容器,控制权发生了反转,因此称为控制反转

在这里插入图片描述


二.IOC-控制反转

  • IOC是 Inverse of Control 的简写,意思是控制反转。是降低对象之间的耦合关系的设计思想。
  • 通过IOC,开发人员不需要关心对象的创建过程,交给Spring容器完成。具体的过程是,程序读取Spring 配置文件,获取需要创建的 bean 对象,通过反射机制创建对象的实例。
  • 缺点:对象是通过反射机制实例化出来的,因此对系统的性能有一定的影响。
  • 优点:
  • 内存控制:统一管理对象,避免对象乱创建导致额外的内存开销。便于内存的优化。
  • 降低耦合度:便于项目的扩展、易于维护。如果IoC+接口情况下,删除任意实现类都不会导致程序编译出错。虽然运行到特定得代码会报错,但是其他代码在使用时不会有问题-----从侧面也反应出是松耦合。

举个简单的例子:你是一名租客要租房子,IOC就相当于房屋中介,他负责管理所有的房源,他给你提供,你要找的所有已经登记的房源对象的信息。你如果需要什么就会提供什么。

在这里插入图片描述


三.DI-依赖注入

  • Dependency Injection,说的是创建对象实例时,同时为这个对象注入它所依赖的属性。相当于把每个bean与bean之间的关系交给容器管理。而这个容器就是spring。
  • 例如:我们通常在 Service 层注入它所依赖的 Dao 层的实例;在 Controller层注入 Service层的实例。

在这里插入图片描述


四. IOC和DI

  • IOC的别名,2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理对象变为由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection,DI)”。他的这个答案,实际上给出了实现IOC的方法:注入。
  • 所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
  • 所以,依赖注入(DI)和控制反转(IOC)是从不同的角度描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦.

五.Spring框架使用(IoC)

  • 1.创建JavaBean
  • 2.将JavaBean配置给Spring容器进行管理
<bean id="book" class="com.it.spring.beans.Book">
    <property name="bookId" value="1"/>
    <property name="bookName" value="Java程序设计"/>
    <property name="bookPrice" value="20.20"/>
    <property name="publishTime">
        <bean class="java.util.Date"/>
    </property>
</bean>
  • 3.初始化Spring容器
  • 加载Spring核心配置文件applicationContext.xml
ClassPathXmlApplicationContext context =    new ClassPathXmlApplicationContext("applicationContext.xml");
  • 4.通过Spring容器获取对象
Book book = (Book)context.getBean("book");

  • Spring IoC原理
  • ①首先通过ClassPathXmlApplicationContext类加载Spring的核心配置文件
  • ②解析核心配置文件applicationContext.xml,获取bean的配置信息
  • ③当我们从容器中获取对象时,Spring容器就会根据bean的id通过反射技术创建对象并完成属性的注入

六.注入类型的三种方式

  • ①set方法
  • 通过property标签完成属性值的注入,实际上调用的就是对应属性的set方法
  • 属性注入时,简单类型和字符串类型的值都可以直接通过value属性指定
  • 对象类型可以有以下两种注入方式
<property id="..." name="objAttr">
    <bean class="package.Class"/>
</property>
<bean id="objRef" class="package.Class"/>
<property id="..." name="objAttr" ref="objRef"></property>
  • ②构造方法
  • 就是在构造方法中(可以通过索引来确定参数的顺序 index=0、1)
<bean id="book3" class="com.it.spring.beans.Book">
    <constructor‐arg>
        <value>3</value>
    </constructor‐arg>
    <constructor‐arg value="phython程序设计"/>
    <constructor‐arg value="44.44" />
    <constructor‐arg ref="date"></constructor‐arg>
</bean>
  • 通过index属性可以给构造器参数指定顺序,如果没有index属性,则所有参数的顺序必须于类中构造器参数一致。
  • ③接口注入

  • The best investment for young people is to invest in yourself
    在这里插入图片描述
  • 2020.03.25 来自辰兮的第36篇博客
发布了40 篇原创文章 · 获赞 182 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_45393094/article/details/105095982