基于构造函数的依赖注入
我们知道,bean标签中指定的类会进行初始化,这个初始化过程中自然会调用构造函数,那我们也可以利用这个构造函数完成依赖注入。
先创建一个类:
public class TextEditor { public TextEditor(SpellChecker spellChecker) { System.out.println("TextEditor的构造函数"); } public TextEditor(String s) { System.out.println(s); } }
如上,可以看见有两个构造函数。
第一个构造函数的参数是自定义类型,第二个是一个字符串类型。两种不同的参数类型在配置文件中的写法是不一样的,下面会提到。
再创建一个测试类:
public class MainApps { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); TextEditor editor = (TextEditor) context.getBean("text"); } }
配置文件内容如下:
<bean id="text" class="Dependency.injection.TextEditor"> <constructor-arg type="java.lang.String" value="这是一个构造函数注入的值"/> </bean>
配置文件中,除了常见的bean标签,需要使用constructor-arg标签来完成构造函数的注入。
运行测试类输出:
这是一个构造函数注入的值
如果向调用上面一个构造函数,配置文件内容如下:
<bean id="text" class="Dependency.injection.TextEditor"> <constructor-arg ref="spellChecker"/> </bean> <bean id="spellChecker" class="Dependency.injection.SpellChecker"/>
注意:
1.如果你需要传递一个对象的引用,就直接用ref;如果你需要传递一个java自带的数据类型,则需要先在type里声明类型,再用value设置值。
2.如果构造参数的参数列表有多个参数,则传递的顺序就是参数列表的顺序。
基于设值函数的依赖注入
通过bean调用设值函数来完成依赖注入。
先准备一个类:
public class TextEditor { private String name; //设值函数 public void setName(String name) { this.name = name; } public void getName() { System.out.println(this.name); } }
注意私有属性name,下面会通过bean设置这个属性的值。
再准备一个测试类:
public class MainApps { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); TextEditor editor = (TextEditor) context.getBean("text"); editor.getName(); } }
配置文件内容如下:
<bean id="text" class="Dependency.injection.TextEditor"> <property name="name" value="李四"/> </bean>
运行测试类输出:
李四
注意:
1.设值函数也可以传递引用,同样使用ref。
2.配置文件中,设值函数用的是property。构造函数注入用的是constructor-arg