前面涉及到依赖注入,我们一般哦都是将一个bean引用注入到另一个bean 的属性or构造器参数or Setter参数,即将为一个对象与另一个对象进行关联。
bean装配的另一个方面是指将一个值注入到bean的属性or构造器参数中,通常我们可以将值硬编码在配置类中,XML中也是硬编码(写出所有值)。
1、若想避免硬编码,让这些值在运行时再确定,Spring提供了两种在运行时求值的方式。
- 属性占位符(Property placeholder)——Spring支持将属性定义到外部的属性文件中,然后用占位符将其插入到Spring bean中。
- Spring表达式语言(SpEL)
2、注入外部(属性源中)的值
Spring中,处理外部值最简单的方式是:
声明属性源——@PropertySource(“classpath:/xxx/xxx/app.property”)
再通过Spring的Environment来检索属性值——env.getProperty("xxx");
这样我们就利用外部文件中的值完成了注入。
3、Spring中的Environment API
这个接口表示当前运行程序的运行环境,可以直接从Environment中检索属性。
(详细解析参考:http://jinnianshilongnian.iteye.com/blog/2000183)
4、解析属性占位符
占位符形式: "${disc.title}"(括号里为属性名称)
解析外部属性能够将值的处理推迟到运行时,它根据名称解析来自Spring Environment和属性源的属性。
5、使用SpEL进行装配(非常强大)
Spring表达式语言提供了一种更通用的方式在运行时计算要注入的值,可以实现超乎想象的装配效果。
SpEL表达式均要放入"#{ }"中。(配置时)
SpEL可以表示字面值,如浮点、String值以及Boolean值:
#{3.14159}、#{'Hello'}、#{false}
SpEL可以引用bean(通过ID)、属性和方法;
#{beanID}、#{beanID.field}、#{beanID.method()}
运算符T()的结果是一个Class对象,它的价值在于可以访问目标类的静态方法和常量,例如:
T(java.lang.Math).random()
SpEL还提供许多其他运算符以及丰富的运算功能(计算表达式、计算集合)。