对于spring中IOC和DI的理解

2018-07-09  本文已影响0人  一路花开_8fab

1. 概述

IOC是一种设计思想,旨在实现调用类和实现类的松耦合,调用类只依赖接口,在编译阶段并不知道具体使用哪个实现类,而是将这个控制权交给第三方容器,在运行时由容器将实例变量(具体的实现类)注入到对象中(调用类)。
DI是具体的实现技术,是指由第三方组件负责将实例变量(实现类)传入到对象(调用类)中去。

2.IOC举例

先看一个非IOC的方式:

public interface Animal {
    public void perform();
}
public class Tiger implements Animal {
    @Override
    public void perform() {
        System.out.println("A tiger is performing!");
    }

    @Override
    public String toString() {
        return "I'm a tiger";
    }
}
public class Zoo {
    private Animal animal;

    public Zoo() {
        this.animal = new Tiger();
    }

    public void perform(){
        animal.perform();
    }

    @Override
    public String toString() {
        if (animal == null) {
            return null;
        }
        return animal.toString();
    }
}

Zoo在构造函数中自行创建了Tiger的示例,这使得Zoo和Tiger紧密地耦合在了一起,扩展性会很差(比如Zoo需要一个Lion进行表演)。
如果使用IOC的方式,Zoo没有自行创建Animal实例,而是在构造的时候把Animal实例作为构造器参数传入。代码如下:

public class Zoo {
    private Animal animal;

    // Animal被注入进来
    public Zoo(Animal animal) {
        this.animal = animal;
    }

    public void perform(){
        animal.perform();
    }

    @Override
    public String toString() {
        if (animal == null) {
            return null;
        }
        return animal.toString();
    }
}

3.DI的两种方式

3.1构造器注入

构造器注入是在Bean构造过程中执行的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
    <bean id="tiger" class="org.xrq.action.by.Tiger" />
     
    <bean id="zoo" class="org.xrq.action.by.Zoo">
        <constructor-arg  ref="tiger" />
    </bean>
         
</beans> 

3.2 Setter注入

Setter注入是在Bean实例创建完毕之后执行,如下:

public class Zoo {
     
    private Animal animal;
     
    public Animal getAnimal() {
        return animal;
    }
 
    public void setAnimal(Animal animal) {
        this.animal = animal;
    }

   public void perform(){
        animal.perform();
    }
 
    @Override
    public String toString() {
        if (animal == null) {
            return null;
        }
        return animal.toString();
    }
     
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
    <bean id="tiger" class="org.xrq.action.by.Tiger" />
     
    <bean id="zoo" class="org.xrq.action.by.Zoo">
        <property name="animal" ref="tiger" />
    </bean>
         
</beans>   

3.3 思考

  1. Spring引入Autowire(自动装配)机制就是为了解决<bean>标签下<property>标签或<constructor-arg>标签过多的问题
  2. 对于强依赖,可使用构造器注入,对于弱依赖,推荐使用Setter注入

4. 参考文章

http://www.importnew.com/13619.html
http://www.importnew.com/24731.html
https://my.oschina.net/u/3759357/blog/1825620

上一篇下一篇

猜你喜欢

热点阅读