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 中如何创建和使用切面。