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

本文介绍如何使用构造函数进行依赖注入,通过Spring框架的XML配置实现类间的依赖关系,并展示了具体的Java代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值