通过以上的学习,对spring容器和DI的概念应该比较清晰了,DI(依赖注入)作为spring的核心,spring当然提供了一套完善的机制来进行依赖注入。前篇文章从概念上介绍了依赖注入,本篇着重学习spring依赖注入的方法,这里主要采用xml的方式。
基本注入
构造器注入和设值注入是依赖注入的两种主要方式,spring对此有很完善的实现,下面首先以代码的形式进行简要的说明。
构造器注入
Spring容器通过调用bean的构造函数(可能带有几个参数,每个参数代表一个依赖)完成构造器注入。通过静态工厂方法和调用构造器及其类似,这里一并进行说明。
Spring中构造器依赖注入采用以下的形式,每个参数用bean标签的子标签 < constructor-arg >进行配置:
<bean id="..." class="com.test.wdi.ExampleBean">
<constructor-arg index="..." value="..." name="..." ref="..." type="..."></constructor-arg>
.. .. ..
</bean>
Index:在构造函数中参数的位置,从0开始<constructor-arg >标签中的配置包含5个项,使用他们中的某些进行某个依赖的配置,简单的描述如下:
Value:参数值,通常是基本类型和 type或者index配合使用。
Name:构造函数中参数的名字
Ref:引用其他Spring管理的对象
Type:参数的类型,值为基本类型或者完全限定的类名。
基本Bean
下面采用代码加注释的形式分别对以上的配置项加以说明,引用的类库见以前的文章,首先是简单的代码结构截图:
Fruit
Apple、Banana是用来演示ref配置项的,只是一个简单的类,没有任何字段。Fruit包含一个Apple和一个Banana,其代码如下:
package com.test.wdi;
/**
* @date 2015-2-27
* @Description:此类主要是为了说明构造器注入的ref项,包含了基本的构造函数,静态工厂方法,和实例工厂方法
*/
public class Fruit {
private Apple apple;
private Banana banana;
public Fruit() {
super();
}
/**
* 静态工厂方法
*/
public static Fruit newInstance(Apple apple, Banana banana){
return new Fruit(apple, banana);
}
/**
* 实例工厂方法
*/
public Fruit newInstance1(Apple apple, Banana banana){
return new Fruit(apple, banana);
}
/**
* 传统带参构造函数
*/
public Fruit(Apple apple, Banana banana) {
super();
this.apple = apple;
this.banana = banana;
}
public Apple getApple() {
return apple;
}
public void setApple(Apple apple) {
this.apple = apple;
}
public Banana getBanana() {
return banana;
}
public void setBanana(Banana banana) {
this.banana = banana;
}
@Override
public String toString() {
return hashCode()+ "Fruit [apple=" + apple + ", banana=" + banana + "]";
}
}
ExampleBean
ExampleBean是用来演示除ref之外的其他配置项的,它有连个基本类型的字段,其代码如下:
package com.test.wdi;
/**
* @date 2015-2-28
* @Description:此类用来说明构造器注入配置项中的 name index type value的,为了方便重写了toString方法
*/
public class ExampleBean {
private int years;
private String ultimateAnswer;
private boolean test;
public ExampleBean() {
super();
}
/**
* 构造函数2,和构造函数1一样具有两个参数,如果bean配置中不加入type的限制,
* 将会有和预期不一致的结果
*/
public ExampleBean(int years, boolean test) {
this.years = years;
this.test = test;
}
/**
* 构造函数1
*/
public ExampleBean(int years, String ultimateAnswer) {
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
@Override
public String toString() {
return "ExampleBean [years=" + years + ", ultimateAnswer=" + ultimateAnswer + ", test=" + test + "]";
}
}
BeanXMl配置
Bean的配置,将依次说明<constructor-arg >标签中每个配置属性的简单用法和它们的组合。bean配置包含连个文件,allbean.xml是主配置文件,它通过import标签引入t1.xml,而t1.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">
<!--
此配置文件是spring 元数据的配置文件,根标签为 beans标签。
在这个标签下可以定义由Spring 管理的 bean,其定义形式如下被注释的地方所示:
基本的配置包括一个容器全局唯一的字符串id,和一个完全限定的类名。
但在这个例子中,有两个import标签,分别引入了另外两个 xml元数据配置文件。
这么做的好处是,不同的 bean定义对应相应的程序体系架构。
import标签导入的配置文