2.1 声明Bean
2.1.1 创建Spring配置
- XML文件方式
- 注解方式
在XML文件中声明Bean时,Spring配置文件的根元素是来源于Spring beans 命名空间所定义的<bean>元素。
Spring核心框架自带了10个命名空间配置:
aop | 切面、@AspectJ |
beans | 声明Bean和装配Bean |
context | Spring应用上下文,自动检测,自动装配Bean,注入非Spring直接管理的对象 |
jee | 与JavaEEAPI的集成,如JNDI和EJB |
jms | 声明消息驱动的POJO提供了配置元素 |
lang | 支持配置Groovy、JRuby或BeanShell等脚本的Bean |
mvc | 启用SpringMVC的能力 |
oxm | 支持Spring对象到XML映射配置 |
tx | 声明式事务配置 |
util | 工具类,包括把集合配置为Bean,属性占位符 |
2.1.3 构造器注入
< constructor-arg value= "15" />
不配置时,使用默认的构造器
通过构造器注入对象引用:
<constructor-arg ref=""/>
通过工厂方法创建Bean:<bean>元素有一个factory-method属性,允许调用一个指定的静态方法,从而代替构造方法来创建一个类的实例
2.1.4 Bean的作用域
所有Spring Bean默认都是单例,当容器分配一个Bean时,总是返回Bean的同一个实例。
SpringBean的作用域
- singleton:单例,默认。在每一个Spring容器中,一个Bean定义只有一个对象实例
- prototype:允许Bean的定义可以被实例化任意次,每次调用都创建一个实例
- request:在一次HTTP request中,每个Bean定义对应一个实例,仅在基于web的Spring上下文中有效
- session:在一个HTTP session中,每个Bean定义对应一个实例,仅在基于web的Spring上下文中有效
- global-session:在一个全局HTTP session中,每个Bean定义对应一个实例,仅在Portlet上下文有效
2.1.5 初始化和销毁Bean
使用Bean的init-method和destroy-method属性,指定相应的方法
如果在上下文中定义的很多Bean都拥有相同名字的初始化方法和销毁方法,可使用<beans>元素的default-init-method和default-destroy-method属性这两个方法,为应用上下文中所有的Bean设置了共同的初始化方法。
2.2 注入Bean属性
Springle可以借助属性的set方法来配置属性的值实现setter方式注入
2.2.1 注入简单值
可以使用<property>元素配置Bean的属性。
<property name="" value=""/>
2.2.2 引用其他Bean
<property name="" ref=""/>
注入内部Bean(inner bean):内部Bean是定义在其他Bean内部的Bean,不能被复用,仅适用于一次注入,不能被其他Bean引用
2.2.3 使用spring的命名空间p装配属性
命名空间p的schema uri:
http://www.springframework.org/schema/p
通过此声明,可以使用p:作为<beans>所有属性的前缀来装配Bean的属性
给属性加-ref后缀来告知spring应装配一个引用
2.2.4 装配集合
Spring提供了4种类型的集合配置元素:
- <list> :装配list类型的值,允许重复
- <set>:装配set类型的值,不允许重复
- <map>:装配map类型的值,名称和值可以是任意类型
- <props>:装配properties类型的值,名称和值必须都是string型
<list>和<set>对应于数组和java.util.collection任意实现
<map>对应于java.util.Map
<props>对应于java.util.Properties
装配List、Set、Array
<bean id="" class="">
<property name="">
<list>/<set>
<ref bean=""/>
</list>/</set>
</property>
</bean>
无论<list>还是<set>都可以用来装配类型为java.util.Collection的任意实现或数组的属性
装配Map
<bean id="" class="">
<property name="">
<map>
<entry key="" value-ref=""/>
...
</map>
</property>
</bean>
<entry>的属性:
key | 指定map中entry的键 |
key-ref | 指定map中entry的键位Spring上下文中其他bean的引用 |
value | 指定map中entry的值 |
value-ref | 指定map中entry的值为Spring上下文中其他bean的引用 |
当键和值都不是String类型时,将键-值对注入到Bean属性的唯一方法就是使用<map>元素
装配Properties集合
<bean id="" class"">
<property name="">
<props>
<prop key=""> value </prop>
...
</props>
</property>
</bean>
2.2.5 装配空值
<property name=""><null/></property>
2.3 使用表达式装配
Spring 3 引入了Spring表达式语言SpEL-Spring Expression Language
2.3.1 SpELl的基本原理
#{ } 界定符代表其中的值是SpELl表达式
字面值:可直接加入字面量
引用Bean、Properties和方法:
#{ Bean | Bean.属性 | Bean.方法 }
null-safe存取器:
“?.”代替“.” 确保左边项补位null,否则不执行方法
操作类:
SpELl中使用T()运算符调用类作用域的方法和常量。T( )运算符的结果会返回一个类对象,通过该运算符可以访问指定类的静态方法和常量。
2.3.2 在SpEL值上执行操作
SpEL运算符:
- 算数运算: + - * / % ^
- 关系运算: < > == <= >= lt gt eq le ge
- 逻辑运算:and or not !
- 条件运算: ?:(ternary) ?:(Elvis)
- 正则运算:matches
“+”可用于字符串连接
关系运算对照:
符号名 | 符号 | 文本类型 |
等于 | == | eq |
小于 | < | lt |
小于等于 | <= | le |
大于 | > | gt |
大于等于 | >= | ge |
三元运算:
- 条件?结果1:结果2
- 条件(值.属性)?:结果
条件不为null,结果为条件的值,否则为结果的值
2.3.3 在SpELl中筛选集合
<util:list>元素由Spring的util命名空间定义,它创建了一个java.util.List类型的Bean,这个集合中包含了配置中的所有Bean,形成一个包含n个bean的List集合
访问集合成员:
#{ 集合名[ 索引 ] } //索引从0开始
访问map:
#{ map名[ key ] }
访问properties:
#{ Bean名[ '属性' ] }
两种特殊选择属性方法:
- systemEnviroment. 包含了应用程序所在机器上的所有环境变量,是一个java.util.Properties集合
- systemProperties. 包含了Java应用程序启动时所设置的所有属性(通常通用-D参数)
[ ]还可用来通过索引来得到字符串的某个字符
查询集合成员
#{ 集合 .? [条件] } //符合条件的
#{ 集合 .^ [条件] } //第一个匹配项
#{ 集合 .$ [条件] } //最后一个匹配项
投影集合
#{ 集合 .! [条件] } //从集合中选择每个成员的一种属性,放入一个新的集合中
*建议仅在使用传统方式很难甚至无法装配,但SpELl可以实现时,使用SpEL
第二章小结:
Spring容器是Spring框架的核心
BeanFactory:最简单的容器,提供基础的依赖注入和Bean装配服务
ApplicationContext:提供更高级的框架服务