Spring 为环境相关的 bean 所提供的解决方案其实与构建时的方案没有太大的差别。当然,在这个过程中需要根据环境决定该创建哪个 bean 和不创建哪个 bean。不过 Spring 并不是在构建的时候做出这样的决策,而是等到运行时再来确定。这样的结果就是同一个部署单元(可能会是 WAR 文件)能够适用于所有的环境,没有必要进行重新构建。
我们也可以通过元素的profile 属性,在 XML 中配置 profile bean。例如,为了在 XML 中定义适用于开发阶段的嵌入式数据库 DataSource bean,我们可以创建如下所示的 XML 文件:
与之类似,我们也可以将 profile 设置为 prod,创建适用于生产环境的从 JNDI 获取的 DataSource bean。同样,可以创建基于连接池定义的 DataSource bean,将其放在另外一个 XML 文件中,并标注为 qaprofile。所有的配置文件都会放到部署单元之中(如 WAR 文 件),但是只有 profile 属性与当前激活 profile 相匹配的配置文件才会被用到。
你还可以在根 <beans> 元素中嵌套定义 <beans> 元素,而不是为每个环境都创建一个 profile XML 文件。这能够将所有的 profile bean 定义放到同一个 XML 文件中,重复使用元素来指定多个 profile,如下所示:
除了所有的 bean 定义到了同一个 XML 文件之中,这种配置方式与定义在单独的 XML 文件中的实际效果是一样的。这里有三个 bean,类型都是 javax.sql.DataSource,并且 ID 都是 dataSource。但是在运行时,只会创建一个 bean,这取决于处于激活状态的是哪个 profile。