- 声明Bean
- 注入Bean属性
- 表达式装配
1. 声明Bean
声明Bean首先需要先了解Spring的配置。
1.1 Spring配置
Spring是一个基于容器的框架,如果没有配置Spring,那么它就是一个空的容器。Spring 3.0 开始,提供了两种配置Bean的方式。- 传统上,Spring使用一个或多个XML文件作为配置文件;
- 基于java注解的配置方式。(Spring 3.0 后支持的,这一章不会讲解)
先了解下Spring的配置文件。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Bean 定义在这 -->
</beans>
在标签内,可以放置Spring所有的配置信息,包括元素的声明。但是beans不是唯一的Spring的命名空间。Spring框架自带的多种XML命名空间,通过这些命名空间可以配置Spring容器
|
同样,很多的命名空间我们暂时没有接触到,这里先了解清楚<beans>命名空间。
1.2 通过构造器注入Bean
在说构造器之前,先讲下声明声明id和对应的class类通过构造器注入,前提是构造器能够接受参数。如下:
public class Juggler implemnets Performer {
private int beanBags = 3;
public Juggler(){}
public Juggler(int beanBags){
this.beansBags = beanBags;
}
·····
}
Juggler类有两个构造函数,默认构造函数不接受任何参数;另外则是接收一个int型的参数。为了调用带参数的构造函数,需要传递一个参数。因此在配置文件中,声明应以下面的形式:
通过constructor-arg设置构造函数参数。这样就调用了带参数的构造函数。
- 通过构造器注入对象引用
如果构造函数的参数除了基本的类型,还带有其它的类型,比如,自定义的类名。即对象引用。bean的声明就必须做稍微的改变:
<!--首先需要先声明引用的对象为spring<bean>,假设我需要引用Sonnet29-->
<bean id="sonnet29" class="com.springinaction.springidol.Sonnet29" />
<!--与之前的构造函数的稍微有点差别-->
<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
<constructor-arg value="15"/>
<constructor-arg ref="sonnet29"/>
</bean>
上面的代码所执行的逻辑本质上与以下java代码相同:
Poem sonnet29 = new Sonnet29();
Performer duke = new PoticJuggler(15, sonnet29);
- 通过工厂创建Bean
有时候静态工厂是实例化对象的唯一方法。Spring支持通过<bean>元素的factory-method属性来装配工厂创建Bean。
public class Stage{
private Stage(){
}
private static class StageSingletonHolder {
static Stage instance = new Stage(); //延迟加载实例
}
private static Stage getInstance() {
return StageSingletonHolder.instance; //返回实例
}
}
由于Stage没有公开的构造方法,而是通过调用静态方法getInstance()返回实例(出于线程安全的考虑,使用了一种称为“Initialization-on-demand holder”的技术,具体请查看http://chenjianjx.iteye.com/blog/1839117)。因此我们可以用如下方法,进行配置:
1.3 Bean作用域
默认情况下,所有的Spring Bean都是单例。当容器分配一个Bean时,总返回的是同一个实例。在<bean>配置时,Spring支持声明Bean的作用域。通过配置Bean的scope属性,设置作用域。默认情况下,scope的属性设置为singleton,但是如果需要每次请求时产生一个新的Bean实例,则需要设置为prototype。除此之外,还包括以下几个作用域选项:
|
具体细节,可以参考:http://blog.csdn.net/feihong247/article/details/7798474
2. 注入Bean属性
简单的讲,其实注入Bean属性,就相当于调用Bean中的setter函数,和<bean>中的构造器注入差不多。- 简单值是通过<property>配置,直接值直接调用value,而其他对象引用使用ref。
<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler"> <property name="song" value="haha"/> <property name="instrument" ref="saxophone"/>
- 注入内部Bean是在<property>元素中直接声明Bean
<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler"> <property name="song" value="haha"/> <property name="instrument" > <bean class="org.springinaction.springidol.Saxophone"/> </property>
- 使用Spring命名空间p装配属性前提: 在<beans>中加入
xmlns:p="http://www.springframework.org/schema/p"
- 然后bean的配置就变成如下所示:
<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler"> <p:song = "haha"/> <p:instrument = "saxophone"/>
2.1 装配集合
- 装配List、Set和Array
一般为以下形式:
<bean id="hank" class="com.springinaction.springidol.OneManBand"> <property name="instruments"> <list> <ref bean="guitar" /> <ref bean="cymbal" /> <ref bean="harmonica" /> </list> </property> </bean>
<list>元素包含一个或多个值。<ref>元素用来定义Spring上下文中的其它Bean引用,成员还包括<value>、<bean>和<null>。实际上,<list>也可以包含<list>作为其成员,形成多维列表。
- 装配Map集合 先来看看Spring配置文件中如何申明配置:上面的示例其实就相当于一个声明了一个map集合,以键值对的方式,key指定entry的键,而value-ref属性定义了entry的值,并引用了Spring上下文的其它Bean。
<bean id="hank" class="com.springinaction.springdiol.OneManBand"> <property name="instruments"> <map> <entry key="GUITAR" value-ref="guitar" /> <entry key="CYMBAL" value-ref="cymbal" /> <entry key="HARMONICA" value-ref="harmonica" /> </map> </property>
- 装配Properties集合
当如果map装配的每一个entry的键和值都为String类型是,就可以用Properties代替Map。声明可map的示例差不多,只要稍微改动些值。如下:
······ <props> <prop key="aaa">BBB CCC </prop> </props> ······
- 装配空值
属性为空的,可以按以下设置:
<property name="someNullObject"><null/></property>
3. 使用Spring表达式装配
Spring 3 引入了Spring表达式语言(Spring Expression Language,SpEL)。SpEL的主要作用在于:能够动态的获取值,进行传参,包括传递函数参数的值或者直接值。
采用的格式是: #{}
比如说SpEL和标准的bean装配是等价的。
<property name="hello" value="#{world}" />
等价于
<property name="hello" ref="world" />
SpEL装配立即值时,支持以下几种格式或者类型:
- 整数和浮点型数
- 科学计数法
- 字符串
- 布尔型
SpEL提供了几种运算符,
运算符类型 运算符 算术运算 +、-、*、/、%、^ 关系运算 <、>、==、<=、>=、lt、gt、eq、le、ge 逻辑运算 and、or、not、| 条件运算 ?: (ternary)、?: (Elvis) 正则表达式 matches 进行运算同样提供了筛选集合的方法。
访问集合:和java一样。
查询集合:.?[] 另外 提供了“.^[]”和“.$[]”匹配第一个和最后一个匹配项。
投影集合:.![]
4. 小结
本章,对装配Bean的方法进行了系统的概述,并且介绍了一些实例和技巧。最常见的方式是使用XML文件,因此在了解Spring必须先从了解Spring的XML文件开始。