Spring In Action ②
初始化和销毁Bean
init-method && destory-method
<bean id="auditorium" class="test.Audirorium" init-method="turnOnLights" destory-method="turnOffLights"/>
如果上下文中有很多Bean都有相同name的初始化方法和销毁方法。可以在Beans元素的default-init-method && default-destory-method方法中声明。
<beans xmlns=********** default-init-method="init" default-destroy-method="destory"> <bean/>.... <beans>
使用<property>元素配置Bean属性,需要调用属性的setter方法来注入.
类似如下:
<property name="age" value="15"/>
命名空间p
<beans ********* xmlns:p="http://www.springframework.org/schema/p"> .... <p:age = "15"/> <p:instrument-ref="saxophone"/>
内部Bean(inner Bean) : 可以使用在setter和构造器注入两种.
<property name="instrument"> <bean class="test.Saxophone"/> </property> 类似: <bean id="saxophone" class="test.Saxophone"/> ... <property name="instrument" ref="saxophone"/> ...
装配集合:可以装配各种集合,如java.util.List, java.util.Set, java.util.Collection, java.util.Map,java.util.Properties等等。可以设置properties和null值。
<list> 可重复
<set> 不可重复
<map> name value 可以是任意类型
<props> name value 必须是string类型
<property name="instruments"> <list> <ref bean="guitar"/> <ref bean="harmonica"/> </list> </property> ***************************************** <property name="instruments"> <list> <ref bean="guitar"/> <ref bean="guitar"/> </list> </property> ***************************************** <property name="instruments"> <map> <entry key="Guitar" value-ref="guitar"/> <entry key="Hamonica" value-ref="harmonica"/> </map> </property> *************************************** key: entry键为string类型时 key-ref: entry键为其他Bean时 value: entry值为string类型时 value-ref: entry值为其他Bean时 *************************************** <property name="instruments"> <props> <prop key="Guitar">guitar hum hum hum</prop> <prop key="Hamonica"><null/></prop> </props> </property>
使用表达式装配
SpEL(Spring Expression Language)
字面值
<property name="count" value="#{5}"/> <property name="count" value="#{5.98}"/> <property name="name" value="#{'Chuck'}"/> <property name="enable" value="#{true}"/>
引用bean
<!-- 引用bean --> <property name="instrument" value="#{guitar}"/> <property name="instrument" ref="guitar"/> <!-- 会调用 kenny.getInstrument() --> <property name="instrument" ref="#{kenny.instrument}"/> <property name="song" ref="#{kenny.selectSong().toUpperCase()}"/> <!-- 避免空指针异常,使用 ?. 代替 . 确保左边值不为null --> <property name="song" ref="#{kenny.selectSong()?.toUpperCase()}"/>
调用类的方法: T()运算符
<... value="#{T(java.lang.Math).PI}"/>
使用SpEL进行数值运算
<... value="#{counter.total + 42}"/> <... value="#{T(java.lang.Math).PI * circle.radius^2}"/> <!-- 比较值 --> <... value="#{ circle.radius le 21}"/> <!-- le less or equal --> <!--eq equal --> <!--lt less --> <!--gt great --> <!-- ge great or equal --> <!-- 逻辑表达式 and or not --> <!-- 条件表达式 ?:--> <!-- 正则表达式 --> <... value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.com' ? "right email" : "wrong email"}"
使用SpEL筛选集合
public class City{ private String name; private String state; private Integer population; }
<util:list id="cities"> <bean class="test.City" p:name="Chicago" p:state"IL" p:population="232322"/> <bean class="test.City" p:name="Houston" p:state"TX" p:population="235452"/> </util:list> <!-- 访问集合 --> <... value="#{cities[1]}"/>
加载properties配置文件
<util:properties id="settings" location="classpath:settings.properties"/> <... value="#{settings['twitter.accessToken']}"/>
systemEnvironment 机器上的所有环境变量
systemProperties 包含了Java启动时所设置的所有属性(通常用-D参数)
<... name="homePath" value="#{systemEnvironment['HOME']}"/> <... name="homePath" value="#{systemProperties['application.home']}"
SpEL查询集合
查询运算符 .?[](所有匹配项) .^[] (第一个匹配项) .$[] 最后一个匹配项
eg cities.?[population gt 10000] --- 集合
投影运算符 .![]
eg cities.![name] 只包含城市名的string类型集合
cities.![name + ‘,’+ state] 包含城市名和地区的String类型集合