3.5 运行时值注入

当讨论依赖注入的时候,我们通常所讨论的是将一个 bean 引用注入到另一个 bean 的属性或构造器参数中。它通常来讲指的是将一个对象与另一个对象进行关联。

但是 bean 装配的另外一个方面指的是将一个值注入到 bean 的属性或者构造器参数中。我们在第 2 章中已经进行了很多值装配,如将专辑的名字装配到 BlankDisc bean 的构造器或 title 属性中。例如,我们可能按照这样的方式来组装 BlankDisc:

CompactDisc.java
@Bean
public CompactDisc sgtPeppers() {
return new BlankDisc(
"Sgt. Pepper's Lonely Hearts Club Band",
"The Beatles"
);
}

尽管这实现了你的需求,也就是为 BlankDisc bean 设置 title 和 artist,但它在实现的时候是将值硬编码在配置类中的。与之类似,如果使用 XML 的话,那么值也会是硬编码的:

<bean id="sgtPeppers" class="soundsystem.BlankDisc"
c:_title="Sgt. Pepper's Lonely Hearts Club"
c:_name="The Beatles" />

有时候硬编码是可以的,但有的时候,我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。为了实现这些功能,Spring提供了两种在运行时求值的方式:

  • 属性占位符(Property placeholder)。

  • Spring 表达式语言(SpEL)。

很快你就会发现这两种技术的用法是类似的,不过它们的目的和行为是有所差别的。让我们先看一下属性占位符,在这两者中它较为简单,然后再看一下更为强大的 SpEL。