Constructor注入

Spring鼓励的是setter injection,但也允许您使用constructor injection,使用setter或constructor来注入依赖关系视您的需求而定,这边先来看看如何使用construtor injection,首先看看HelloBean:

HelloBean.java

package onlyfun.caterpillar;

 

public class HelloBean {

    private String helloWord = "hello";

    private String user = "NoBody";

  

    public HelloBean(String helloWord, String user) {

        this.helloWord = helloWord;

        this.user = user;

    }  

  

    public String sayHelloToUser() {

        return helloWord + "!" + user + "!";

    }

}


 为了突显建构函式,我们这个HelloBean设计的简陋,只提供了建构函式与必要的sayHelloToUser(),我们来看看bean的定义档案:

bean.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">

        <constructor-arg index="0"><value>Greeting</value></constructor-arg>

        <constructor-arg index="1"><value>Justin</value></constructor-arg>

    </bean>

</beans>


 在bean的定义档案中,我们使用<constructor-arg>来表示我们将使用 constructor injection,由于使用constructor injection时并不如setter injection时拥有setXXX()这样易懂的名称,所以我们必须指定参数的位置索引,index属性就是用于指定我们的对象将注入至建构函式中的哪一个参数,索引值从0开始,符合Java索引的惯例。
 来看看测试程序:

Test.java

package onlyfun.caterpillar;

 

import java.io.*;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

 

public class Test {

    public static void main(String[] args) throws IOException {

        InputStream is = new FileInputStream("bean.xml");

        BeanFactory factory = new XmlBeanFactory(is);

      

        HelloBean hello = (HelloBean) factory.getBean("helloBean");

        System.out.println(hello.sayHelloToUser());

    }

}


 实际的执行结果如下:

2004/10/21 下午 03:53:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from resource for InputStream

2004/10/21 下午 03:54:02 org.springframework.beans.factory.support.AbstractBeanFactory getBean

信息: Creating shared instance of singleton bean 'helloBean'

2004/10/21 下午 03:54:03 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory autowireConstructor

信息: Bean 'helloBean' instantiated via constructor [public onlyfun.caterpillar.HelloBean(java.lang.String,java.lang.String)]

Greeting!Justin!


 要讨论使用constructor或setter来完成依赖注入这个问题,其实就等于在讨论一个古老的问题,要在对象建立时就准备好所有的资源,或是在对象建立好后,使用setter来进行设定。
 使用constructor的好处之一是,您可以在建构对象的同时一并完成依赖关系的建立,如果要建立的对象关系很多,使用 constructorinjection会在建构函式上留下一长串的参数,这时使用setter会是个不错的选择,另一方面, setter可以有明确的名称可以了解注入的对象会是什么,像是setXXX()这样的名称会比记忆constructor上某个参数位置代表某个对象来得好。
 然而使用setter由于提供了setXXX()方法,所以不能保证相关的field成员或资源在执行时期不会被更改设定,所以如果您想要让一些field成员或资源变为只读或是私有,使用constructor injection会是个简单的选择

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值