依赖注入
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。