spring-运行时值注入
在项目中经常使用连接数据库的配置,如下所示
<bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"> <property name="driverclassname" value="oracle.jdbc.driver.oracledriver" /> <property name="url" value="jdbc:oracle:thin:@db.dev.cc.cmbc.com.cn:1521:testdb" /> <property name="username" value="testdbuser" /> <property name="password" value="123456" /> </bean>
每个属性都是硬编码,有时候我们希望避免硬编码,而是想让这些值在运行时候再确定。spring提供了两种在运行时求值的方式:属性占位符和spring表达式语言
1、属性占位符:使用${...}包装属性名称
a、引入properties文件
<context:property-placeholder location="test.properties"></context:property-placeholder>
test.properties文件内容
jdbc.driver=oracle.jdbc.driver.oracledriver jdbc.url=jdbc:oracle:thin:@db.dev.cc.cmbc.com.cn:1521:testdb jdbc.username=testdbuser jdbc.password=123456
b、避免硬编码的配置:
<bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"> <property name="driverclassname" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
2、spring表达式:使用#{...}包含spel表达式
a、使用bean的id引用bean
#{person1}
b、调用方法和访问对象的属性
#{person1.age}
#{persion1.getname()} 对于bean方法的方法返回值,也可以调用方法 #{person1.getcar().getcarname()} ,如果person1.getcar()返回为null,则会抛出空指针异常,spring提供了类型安全的运算符"?.", #{persion1.getcar()?.getcarname()} 如果person.getcar()不为空,则调用getcarname()获取返回值,否则,返回null
#{t(java.lang.math).pi} 在表达式中使用类型调用静态属性和方法,必须使用t()运算符
#{t(java.lang.math).random()}
c、对值进行算术、关系、逻辑运算
#{2*t(java.lang.math).pi*26}
#{person1.getage()==90}
#{person1.getage()>90?"年龄大于90":"年龄小于等于90"} 三元运算通常用于判null
#{person.getname()+"dy"} 当“+”运算符的操作数有字符串时,执行的是连接操作
d、集合操作 略