> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/di-3-zhang-gao-ji-zhuang-pei/untitled-1.md).

# 3.5　运行时值注入

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

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

{% code title="CompactDisc.java" %}

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

{% endcode %}

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

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

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

* 属性占位符（Property placeholder）。
* Spring 表达式语言（SpEL）。

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