> 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.md).

# 3.6　小结

我们在本章介绍了许多背景知识，在第 2 章所介绍的基本 bean 装配基础之上，又学习了一些强大的高级装配技巧。

首先，我们学习了 Spring profile，它解决了 Spring bean 要跨各种部署环境的通用问题。在运行时，通过将环境相关的 bean 与当前激活的 profile 进行匹配，Spring 能够让相同的部署单元跨多种环境运行，而不需要进行重新构建。

Profile bean 是在运行时条件化创建 bean 的一种方式，但是 Spring 4 提供了一种更为通用的方式，通过这种方式能够声明某些 bean 的创建与否要依赖于给定条件的输出结果。结合使用 @Conditional 注解和 Spring Condition 接口的实现，能够为开发人员提供一种强大和灵活的机制，实现条件化地创建 bean。

我们还看了两种解决自动装配歧义性的方法：首选 bean 以及限定符。尽管将某个 bean 设置为首选 bean 是很简单的，但这种方式也有其局限性，所以我们讨论了如何将一组可选的自动装配 bean，借助限定符将其范围缩小到只有一个符合条件的 bean。除此之外，我们还看到了如何创建自定义的限定符注解，这些限定符描述了 bean 的特性。

尽管大多数的 Spring bean 都是以单例的方式创建的，但有的时候其他的创建策略更为合适。Spring 能够让 bean 以单例、原型、请求作用域或会话作用域的方式来创建。在声明请求作用域或会话作用域的 bean 的时候，我们还学习了如何创建作用域代理，它分为基于类的代理和基于接口的代理的两种方式。

最后，我们学习了 Spring 表达式语言，它能够在运行时计算要注入到 bean 属性中的值。

对于 bean 装配，我们已经掌握了扎实的基础知识，现在我们要将注意力转向面向切面编程（aspect-oriented programming ，AOP）了。依赖注入能够将组件及其协作的其他组件解耦，与之类似，AOP 有助于将应用组件与跨多个组件的任务进行解耦。在下一章，我们将会深入学习在 Spring 中如何创建和使用切面。
