您的位置:首页 > 编程语言 > Java开发

【Spring】【笔记】《Spring In Action》第二章 Bean装配

2016-05-22 16:50 447 查看
2.1 声明Bean
2.1.1 创建Spring配置

XML文件方式
注解方式

在XML文件中声明Bean时,Spring配置文件的根元素是来源于Spring beans 命名空间所定义的<bean>元素。
Spring核心框架自带了10个命名空间配置:

aop切面、@AspectJ
beans声明Bean和装配Bean
contextSpring应用上下文,自动检测,自动装配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:提供更高级的框架服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息