Spring - 基于构造方法的依赖注入

22 篇文章 0 订阅
14 篇文章 0 订阅

当一个容器调用一个类的构造函数时,就完成了基于构造函数的依赖注入,构造函数中一系列的参数表示对其他类的依赖。

下面从栗子中看构造函数的依赖注入。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值