Spring入门05 - Constructor注入
来源:互联网 发布:光纤猫691数据怎么办 编辑:程序博客网 时间:2024/05/26 12:58
入门 05 - 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会是个简单的选择。
- Spring入门05 - Constructor注入
- Spring框架 constructor-arg注入
- spring setter and constructor注入
- Spring : constructor-arg property 注入
- spring自动注入入门
- Spring入门11 - DataSource注入
- Spring入门_02_属性注入
- Spring入门_03_构造注入
- Spring入门_04_注解注入
- Spring入门篇注入例子
- spring框架setter注入和构造器constructor注入中的内部嵌套
- 依赖注入setter,constructor
- Spring入门篇之Spring注入
- Constructor injection type ambiguities in Spring /使用Spring时,构造函数注入的歧义
- spring中通过constructor来注入参数的四种方式
- Spring入门03 - 依赖注入DI
- Spring入门10 - 集合对象注入
- spring温习笔记-入门-依赖注入
- Java Learning Path(三)过程篇
- Spring入门03 - 依赖注入DI
- JPEG 简易文档 V2.11
- Java Learning Path (一)、工具篇
- Spring入门04 - 第一个Spring程序
- Spring入门05 - Constructor注入
- Java Learning Path(四) 方法篇
- Spring入门06 - Bean定义档进阶读取
- Spring入门07 - Bean生命周期
- JAVA 在图像处理中的应用
- Spring入门08 - 不使用XML定义档
- 验证数字图片的生成
- 感觉嵌入式不像OOP那么好入门
- Spring入门09 - 属性参考与自动绑定