spring_bean的作用域,spring使用外部属性文件和spring_SpEL(三)

1,spring的作用域

2,spring使用外部属性文件

这里以db.properties为例,先建立好db.properties文件,如图:

在spring配置文件中:

说明:

在配置文件里配置bean时,有时需要在bean的配置里混入系统部署的细节信息(例如:文件路径,数据源配置信息等),而这些部署细节实际上需要和bean配置相分离
Spring提供了一个PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将bean配置的部分内容外移到属性文件中,可以在bean配置文件里使用形式为$(var)的变量,
PropertyPlaceholderConfigurer从属性文件里加载属性,并使用这些属性来替换变量。
Spring还允许在属性文件中使用$(propName),以实现属性之间的相互引用。
注册PropertyPlaceholderConfigurer
Spring2.0
<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:db.properties"></property>
</bean>
Spring2.5之后:可通过<context:property-placeholder>元素简化:
-<beans>中添加context Schema定义
-在配置文件中加入如下配置:
<context:property-placeholder location="classpath:db.properties"/>

Spring的SpEL表达式

Spring表达式语言:SpEL
Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于EL: SpEL使用#{}作为定界符,所有在大括号中的字符都将被认为是SpEL
SpEL为bean的属性进行动态赋值提供了便利
通过SpEL可以实现:
1 通过bean的id对bean进行引用
2 调用方法以及引用对象中的属性
3 计算表达式的值
4 正则表达式的匹配

SpEL:字面量
字面量的表示:
整数:<property name="count" value="#{5}"/>
小数:<property name="frequency" value="#{89.7}"/>
科学计数法:<property name="capacity" value="#{1e4}"/>
String可以使用单引号或者双引号作为字符串的定界符号:
<property name="name" value="#{'Chuck'}"/>或<property name='name' value='#{"Chuck"}'
Boolean:<property name="enabled" value="#{false}"/>

SpEL:引用Bean、属性和方法
1 引用其他对象:
<!--通过value属性和SpEL配置Bean之间的应用关系-->
<property name="prefix" value="#{prefixGenerator}"></property>
2 引用其他对象的属性
<!--通过value属性和SpEL配置suffix属性值为另一个bean的suffix属性值-->
<property name="suffix" value="#{sequenceGenerator2.suffix}"/>
调用其他方法,还可以链式操作
<!--通过value属性和SpEL配置suffix属性值为另一个bean的方法的返回值-->
<property name="suffix" value="#{sequenceGenerator2.toString()}"/>
<!--方法的连耦-->
<property name="suffix"
    value="#{sequenceGenerator2.toString().toUpperCase()}"/>

SpEL支持的运算符号
1 算术运算符:+,-,*,/,%,^
<property name="adjustedAmount" value="#{counter.total+42}"/>
<property name="adjustedAmount" value="#{counter.total-20}"/>
<property name="circueference" value="#{2*T(java.lang.Math).PI*circle.radius}"/>
<property name="average" value="#{counter.total/counter.counter}"/>
<property name="remainder" value="#{counter.total%counter.count}"/>
<property name="area" value="#{T(java.lang.Math).PI*circle.radius ^2}"/>
2加号还可以用作字符串链接
<constructor-arg
    value="#{performer.firstName+''+performer.lastName}"/>
3 比较运算符:<,>,==,<=,>=,lt,gt,eq,le,ge
<property name="equal" value="#{counter.total==100}"/>
<property name="hasCapacity" value="#{counter.total le 100000}"/>

4 逻辑运算符: and,or,not,|
<property name="largeCircle" value="#{shape.kind=='circle' and shape.perimeter gt 100000}"/>
<property name="outOfStock" value="#{!product.available}"/>
<property name="outOfStack" value="#{not product.available}"/>
5 if-else运算符:?:(temary),?:(Elvis)
<constructor-arg
    value="#{songSelector.selectSong()=='Jingle Bells'?piano:'jingle bells'}"/>
6 if-else的变体
<constructor-arg
    value="#{kenny.song ?: 'Greensleeves'}"/>
7正则表达式:matches
<constructor-arg
    value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}"/>
8 调用静态方法或静态属性:通过T()调用一个类的静态方法,它将返回一个Class Object,然后在调用相应的方法或属性
<property name="initValue"
    value="#{T(java.lang.Math).PI}"></property>

测试:在spring中的配置:

用到的相关java类(都要加上set/get方法和重写toString方法,这里有的可能没有截全,重写toString是为了测试):


猜你喜欢

转载自blog.csdn.net/youjiangtengwan1/article/details/54091034