美文网首页
对于spring中IOC和DI的理解

对于spring中IOC和DI的理解

作者: 一路花开_8fab | 来源:发表于2018-07-09 21:33 被阅读0次

    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

    相关文章

      网友评论

          本文标题:对于spring中IOC和DI的理解

          本文链接:https://www.haomeiwen.com/subject/vlytpftx.html