课程表

Spring 入门

Spring IoC 容器

Spring 依赖注入

Spring Beans 自动装配

Spring 基于注解的配置

Spring 框架

Spring 事务管理

Spring Web MVC 框架

工具箱
速查手册

Spring 基于构造函数的注入

当前位置:免费教程 » Java相关 » Spring

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

示例:

下面的例子显示了一个类 TextEditor,只能用构造函数注入来实现依赖注入。

让我们用 Eclipse IDE 适当地工作,并按照以下步骤创建一个 Spring 应用程序。

步骤 描述
1 创建一个名为 SpringExample 的项目,并在创建的项目中的 src 文件夹下创建包 com.tutorialspoint
2 使用 Add External JARs 选项添加必需的 Spring 库,解释见 Spring Hello World 实例 章节。
3 com.tutorialspoint 包下创建 Java类 TextEditorSpellCheckerMainApp
4 src 文件夹下创建 Beans 的配置文件 Beans.xml
5 最后一步是创建所有 Java 文件和 Bean 配置文件的内容并按照如下所示的方法运行应用程序。

这是 TextEditor.java 文件的内容:

  1. package com.tutorialspoint;
  2. public class TextEditor {
  3. private SpellChecker spellChecker;
  4. public TextEditor(SpellChecker spellChecker) {
  5. System.out.println("Inside TextEditor constructor." );
  6. this.spellChecker = spellChecker;
  7. }
  8. public void spellCheck() {
  9. spellChecker.checkSpelling();
  10. }
  11. }

下面是另一个依赖类文件 SpellChecker.java 的内容:

  1. package com.tutorialspoint;
  2. public class SpellChecker {
  3. public SpellChecker(){
  4. System.out.println("Inside SpellChecker constructor." );
  5. }
  6. public void checkSpelling() {
  7. System.out.println("Inside checkSpelling." );
  8. }
  9. }

以下是 MainApp.java 文件的内容:

  1. package com.tutorialspoint;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class MainApp {
  5. public static void main(String[] args) {
  6. ApplicationContext context =
  7. new ClassPathXmlApplicationContext("Beans.xml");
  8. TextEditor te = (TextEditor) context.getBean("textEditor");
  9. te.spellCheck();
  10. }
  11. }

下面是配置文件 Beans.xml 的内容,它有基于构造函数注入的配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  7.  
  8. <!-- Definition for textEditor bean -->
  9. <bean id="textEditor" class="com.tutorialspoint.TextEditor">
  10. <constructor-arg ref="spellChecker"/>
  11. </bean>
  12.  
  13. <!-- Definition for spellChecker bean -->
  14. <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
  15. </bean>
  16.  
  17. </beans>

当你完成了创建源和 bean 配置文件后,让我们开始运行应用程序。如果你的应用程序运行顺利的话,那么将会输出下述所示消息:

  1. Inside SpellChecker constructor.
  2. Inside TextEditor constructor.
  3. Inside checkSpelling.

构造函数参数解析:

如果存在不止一个参数时,当把参数传递给构造函数时,可能会存在歧义。要解决这个问题,那么构造函数的参数在 bean 定义中的顺序就是把这些参数提供给适当的构造函数的顺序就可以了。考虑下面的类:

  1. package x.y;
  2. public class Foo {
  3. public Foo(Bar bar, Baz baz) {
  4. // ...
  5. }
  6. }

下述配置文件工作顺利:

  1. <beans>
  2. <bean id="foo" class="x.y.Foo">
  3. <constructor-arg ref="bar"/>
  4. <constructor-arg ref="baz"/>
  5. </bean>
  6.  
  7. <bean id="bar" class="x.y.Bar"/>
  8. <bean id="baz" class="x.y.Baz"/>
  9. </beans>

让我们再检查一下我们传递给构造函数不同类型的位置。考虑下面的类:

  1. package x.y;
  2. public class Foo {
  3. public Foo(int year, String name) {
  4. // ...
  5. }
  6. }

如果你使用 type 属性显式的指定了构造函数参数的类型,容器也可以使用与简单类型匹配的类型。例如:

  1. <beans>
  2.  
  3. <bean id="exampleBean" class="examples.ExampleBean">
  4. <constructor-arg type="int" value="2001"/>
  5. <constructor-arg type="java.lang.String" value="Zara"/>
  6. </bean>
  7.  
  8. </beans>

最后并且也是最好的传递构造函数参数的方式,使用 index 属性来显式的指定构造函数参数的索引。下面是基于索引为 0 的例子,如下所示:

  1. <beans>
  2.  
  3. <bean id="exampleBean" class="examples.ExampleBean">
  4. <constructor-arg index="0" value="2001"/>
  5. <constructor-arg index="1" value="Zara"/>
  6. </bean>
  7.  
  8. </beans>

最后,如果你想要向一个对象传递一个引用,你需要使用 标签的 ref 属性,如果你想要直接传递值,那么你应该使用如上所示的 value 属性。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号