1:构造器注入
类:
public class ExampleBean {
private AnotherBean beanOne;
private YetAnotherBean beanTwo;
private int i;
public ExampleBean(
AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {
this.beanOne = anotherBean;
this.beanTwo = yetAnotherBean;
this.i = i;
}
}
配置文件:
bean id="exampleBean" class="examples.ExampleBean">
*构造器参数类型配置
package examples;
public class ExampleBean {
// No. of years to the calculate the Ultimate Answer
private int years;
// The Answer to Life, the Universe, and Everything
private String ultimateAnswer;
public ExampleBean(int years, String ultimateAnswer) {
this.years = years;
this.ultimateAnswer = ultimateAnswer;
}
}
配置文件:
针对上面的场景可以通过使用'type'
属性来显式指定那些简单类型的构造参数的类型,比如:
*构造参数索引
我们还可以通过index
属性来显式指定构造参数的索引,比如下面的例子:
2:Setter注入
public class ExampleBean {
private AnotherBean beanOne;
private YetAnotherBean beanTwo;
private int i;
public void setBeanOne(AnotherBean beanOne) {
this.beanOne = beanOne;
}
public void setBeanTwo(YetAnotherBean beanTwo) {
this.beanTwo = beanTwo;
}
public void setIntegerProperty(int i) {
this.i = i;
}
}
配置文件:
3:采用static
工厂方法返回对象实例
类:
public class ExampleBean {
// a private constructor
private ExampleBean(...) {
...
}
// a static factory method; the arguments to this method can be
// considered the dependencies of the bean that is returned,
// regardless of how those arguments are actually used.
public static ExampleBean createInstance (
AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {
ExampleBean eb = new ExampleBean (...);
// some other operations...
return eb;
}
}
配置文件:
传给static
工厂方法的参数由constructor-arg
元素提供,这与使用构造器注入时完全一样。而且,重要的是,工厂方法所返回的实例的类型并不一定要与包含static
工厂方法的类类型一致。
4:简单的例子
*配置一个java.util.Properties
实例
jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
如果采用上面的配置,Spring容器将使用JavaBean PropertyEditor
把
元素中的文本转换为一个java.util.Properties
实例
5:引用其它的bean(协作者)、
*
第一种形式也是最常见的形式是通过使用
标记指定bean
属性的目标bean,通过该标签可以引用同一容器或父容器内的任何bean(无论是否在同一XML文件中)。XML 'bean
'元素的值既可以是指定bean的id
值也可以是其name
值
*
第二种形式是使用ref的local
属性指定目标bean,它可以利用XML解析器来验证所引用的bean是否存在同一文件中。local
属性值必须是目标bean的id属性值。如果在同一配置文件中没有找到引用的bean,XML解析器将抛出一个例外。如果目标bean是在同一文件内,使用local方式就是最好的选择(为了尽早地发现错误)。
*第三种方式是通过使用ref的parent
属性来引用当前容器的父容器中的bean。parent
属性值既可以是目标bean的id
值,也可以是name
属性值。而且目标bean必须在当前容器的父容器中。使用parent属性的主要用途是为了用某个与父容器中的bean同名的代理来包装父容器中的一个bean(例如,子上下文中的一个bean定义覆盖了他的父bean)。
<-- notice how we refer to the parent bean
6:集合的配置
通过
、
、及
元素可以定义和设置与Java Collection
类型对应List
、Set
、Map
及Properties
的值。
[email protected]
[email protected]
[email protected]
just some string
7:集合的合并
[email protected]
[email protected]
[email protected]
[email protected]
在上面的例子中,child
bean的adminEmails
属性的
元素上使用了merge=true
属性。当child
bean被容器实际解析及实例化时,其 adminEmails
将与父集合的adminEmails
属性进行合并
[email protected]
[email protected]
[email protected]
8:强类型集合(仅适用于Java5+)
类:
public class Foo {
private Map accounts;
public void setAccounts(Map accounts) {
this.accounts = accounts;
}
}
配置文件:
在foo
bean的accounts
属性被注入之前,通过反射,利用强类型Map
的泛型信息,Spring的底层类型转换机制将会把各种value元素值转换为Float
类型,因此字符串9.99、2.75
及3.99
就会被转换为实际的Float
类型
9:Nulls
用于处理null
值。Spring会把属性的空参数当作空字符串
处理。以下的xml片断将email属性设为空字符串
。
配置文件:
这等同于Java代码:exampleBean.setEmail("")
。而null
值则可以使用元素可用来表示。例如:
上述的配置等同于Java代码:exampleBean.setEmail(null)
。
10:使用p名称空间配置属性
11:使用depends-on
depends-on
属性可以用于当前bean初始化之前显式地强制一个或多个bean被初始化。下面的例子中使用了depends-on
属性来指定一个bean的依赖。
若需要表达对多个bean的依赖,可以在'depends-on'
中将指定的多个bean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。下面的例子中使用了'depends-on'
来表达对多个bean的依赖。
当ApplicationContext
实现加载上述配置时,设置为lazy
的bean将不会在ApplicationContext
启动时提前被实例化,而not.lazy
却会被提前实例化。
需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext
提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。