前言

Spring是一款十分优秀的JAVAEE框架,其主要核心内容就是IoC(控制反转)和AOP(面向切面编程)。这一篇博文是我对IoC相关内容的理解。

IoC和DI简介

  1. IoC英文全称叫Inversion of Control,是面向对象编程的一种设计方案,在Spring中的体现就是把各种bean交给Spring容器进行管理,极大降低了代码的耦合度。比如,之前要使用一个javabean对象,我们要通过new的方式给对象进行实例化,这是在代码里写死的,也是俗称的硬编码。这些一个个对象都在代码里写着,要对它们的依赖或属性进行修改需要改动代码,这就是高耦合的一种表现。而控制反转给我们提出一种方便的解决方案,把bean交给容器,需要修改其内容时只需在配置文件里对其操作,这就极大地降低了耦合度,方便代码的重用。
  2. DI英文名全称Dependency Injection,即是依赖注入。其跟控制反转是从不同角度描述的同一个概念。对象与对象之间总是有依赖关系的,比如对象A属性中包含对象B,通常情况下需要在A的代码中显式地new一个B。而使用依赖注入技术时A只需要定义一个私有的B对象,其实例化过程是由容器运行时在外部new出来再注入到A中。总的来说依赖注入的目的跟IoC一样都是解耦合。

Spring中依赖注入的方法

既然叫注入那肯定有注入的方法。Spring给我们提供了好几种依赖注入的方法,而常用的有两种:setter注入构造函数注入

  1. setter注入
    bean中需要进行注入的属性要有setter方法,如:

    public class Student {
    private Integer stuId;
    private String stuName;

    public void setStuId(Integer stuId) {
    this.stuId = stuId;
    }

    public void setStuName(String stuName) {
    this.stuName = stuName;
    }
    }

    且要在spring的配置文件applicationContext.xml中进行依赖注入

    <bean id="student" class="entity.Student">
    <property name="stuId" value="1"></property>
    <property name="stuName" value="kbdog"></property>
    </bean>

    之后直接从上下文context中获取namestudent的对象时,该对象已经被实例化且注入好属性Student{stuId=1, stuName='kbdog'}

  2. 构造函数注入
    bean中要存在有参构造函数,如:

    public class Student {
    private Integer stuId;
    private String stuName;

    public Student(Integer stuId, String stuName) {
    this.stuId = stuId;
    this.stuName = stuName;
    }
    }

    applicationContext.xml中注入

    <bean id="student" class="entity.Student">
    <constructor-arg index="0" value="1"></constructor-arg>
    <constructor-arg index="1" value="kbdog"></constructor-arg>
    </bean>

    注入的属性为对象时,只需把value换成ref即可,ref指向的bean也要在IoC容器中

可进行依赖注入的类型

  • 基本类型和String
  • 已在IoC容器中的bean
  • 各种集合