当一个容器调用一个类的构造函数时,就完成了基于构造函数的依赖注入,构造函数中一系列的参数表示对其他类的依赖。
下面从栗子中看构造函数的依赖注入。
Example
SpellChecker.java
package com.soygrow.ConstructorDependency;
public class SpellChecker {
public SpellChecker() {
System.out.println("Inside SpellChecker constructor." );
}
public void checkSpelling() {
System.out.println("Inside checkSpelling." );
}
}
TextEditor.java
package com.soygrow.ConstructorDependency;
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public void spellCheck() {
spellChecker.checkSpelling();
}
}
MainApp.java
package com.soygrow.ConstructorDependency;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("ConstructorBeans.xml");
TextEditor textEditor = (TextEditor) context.getBean("textEditor");
textEditor.spellCheck();
}
}
ConstructorBeans.xml
<?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.xsd">
<bean id="textEditor" class="com.soygrow.ConstructorDependency.TextEditor">
<constructor-arg ref="spellChecker"/>
</bean>
<bean id="spellChecker" class="com.soygrow.ConstructorDependency.SpellChecker"/>
</beans>
如果一切正常,运行结果:
Inside SpellChecker constructor.
Inside checkSpelling.
代码分析
- 通过XML中配置bean的构造注入,可以实现依赖注入
- constructor-arg 用于再XML中bean的定义
Constructor arguments resolution
下面介绍一下带参数的构造注入怎么配置,比如下面的类的定义,需要其他bean作为参数的情况:
package x.y;
public class Foo {
public Foo(Bar bar, Baz baz) {
// ...
}
}
XML的配置如下所示:
<beans>
<bean id = "foo" class = "x.y.Foo">
<constructor-arg ref = "bar"/>
<constructor-arg ref = "baz"/>
</bean>
<bean id = "bar" class = "x.y.Bar"/>
<bean id = "baz" class = "x.y.Baz"/>
</beans>
使用constructor-arg 指定构造参数的bean的引用。另外一种情况:使用不同类型的参数作为构造参数,比如下面的情况:
package x.y;
public class Foo {
public Foo(int year, String name) {
// ...
}
}
那么XML配置文件中指定参数的类型和值:
<beans>
<bean id = "exampleBean" class = "examples.ExampleBean">
<constructor-arg type = "int" value = "2001"/>
<constructor-arg type = "java.lang.String" value = "Zara"/>
</bean>
</beans>
最后,最好的传递参数的方式是使用index 属性指定构造参数的索引。index 从0开始,比如:
<beans>
<bean id = "exampleBean" class = "examples.ExampleBean">
<constructor-arg index = "0" value = "2001"/>
<constructor-arg index = "1" value = "Zara"/>
</bean>
</beans>
如果你需要将一个对象作为一个引用,可以使用的ref标签,如果你需要传递值,可以使用上面的value属性。
Spring教程专栏地址:http://blog.csdn.net/column/details/19452.html