薛彬的博客 Xue bin's Personal Growth Website

Spring学习笔记---依赖注入

2016-05-22
薛彬

依赖注入

Spring基于构造函数的依赖注入

当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。

比如我们写一个博客软件,它每次启动都会启用“更新检查”功能。

在Beans.xml中是这样的:

<bean id="blog" class="Blog">
    <constructor-arg ref="updateChecker"/>
</bean>
<bean id="updateChecker" class="UpdateChecker"></bean>

constructor-arg的语句中要使用ref属性,是用来向一个对象传递一个引用。

此时Blog中应该是这样的:

public class Blog {
    private UpdateChecker updateChecker;
    public Blog(UpdateChecker updateChecker) {
        this.updateChecker = updateChecker;
    }
}

这样我们Blog的构造函数中可以加入UpdateChecker updateChecker的参数,这样就会自动向updateChecker对象传递了一个引用,其实也就完成了UpdateChecker updateChecker=new UpdateChecker()的过程。

Spring 基于设值函数的依赖注入

当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后,通过容器在你的 bean 上调用设值函数,基于设值函数的 DI 就完成了。

在Beans.xml中是这样的:

<bean id="blog" class="Blog">
    <property name="updateChecker" ref="updateChecker"/>
</bean>
<bean id="updateChecker" class="UpdateChecker"></bean>

Blog中应该是这样:

public class Blog {
    private UpdateChecker updateChecker;
    public void setUpdateChecker(UpdateChecker updateChecker){
        System.out.println("我是set方法!");
        this.updateChecker=updateChecker;	
    }
    public UpdateChecker getUpdateChecker(){
        return updateChecker;
    }
}

UpdateChecker中:

public class UpdateChecker {
   public UpdateChecker(){
      System.out.println("我是更新检查的构造函数!" );
   }
   public void checkUpdate() {
      System.out.println("检查更新啦!" );
   }  
}

当Blog类实例化后,首先是对更新类创建并引用了, 这时候更新类就调用了它的构造函数,然后就执行set方法了。再分别创建好blog对象和checkUpdate对象后,就调用checkUpdate()方法。

不明白的是为什么就会自动执行set方法了?

注入内部Beans

上面的Beans.xml还可以写成这样:

<bean id="blog" class="Blog">
    <property name="updateChecker">
        <bean id="updateChecker" class="UpdateChecker"/>
    </property>
</bean>

这样的bean就称为内部bean。


评论