Spring框架学习--浅谈@Profile

8 篇文章 0 订阅

在开发软件的时候, 有一个很大的挑战就是将应用程序从一个环境迁移到另外一个环境。 开发阶段中, 某些环境相关做法可能并不适合迁移到生产环境中, 甚至即便迁移过去也无法正常工作。 数据库配置、加密算法以及与外部系统的集成是跨环境部署时会发生变化的几个典型例子。
比如数据库配置。 在开发环境中, 可能会使用嵌入式数据库, 并预先加载测试数据。在生产环境的配置中, 可能会使用JNDI从容器中获取一个DataSource。 通过JNDI获取DataSource能够让容器决定该如何创建这个DataSource, 甚至包括切换为容器管理的连接池。 即便如此,JNDI管理的DataSource更加适合于生产环境, 对于简单的集成和开发测试环境来说, 这会带来不必要的复杂性。
Spring为环境相关的bean所提供的解决方案与构建时的方案没有太大的差别。在这个过程中需要根据环境决定该创建哪个bean和不创建哪个bean。 不过Spring并不是在构建的时候做出这样的决策, 而是等到运行时再来确定。 这样的结果就是同一个部署单元(可能会是WAR文件) 能够适用于所有的环境, 没有必要进行重新构建。Spring 3.1引入了bean profile的功能。 要使用profile, 首先要将所有不同的bean定义整理到一个或多个profile之中, 在将应用部署到每个环境时, 要确保对应的profile处于激活(active) 的状态。

配置profile bean
在Java配置中, 可以使用@Profile注解指定某个bean属于哪一个profile。例如,@Profile(value = “dev”)它会告诉Spring这个配置类中的bean只有在dev profile激活时才会被创建。 如果dev profile没有激活的话, 那么带有@Bean注解的方法都会被忽略。
也可以通过<beans>元素的profile属性, 在XML中配置profile bean。
这里写图片描述
也可以将profile设置为prod, 创建适用于生产环境的从JNDI获取的DataSource bean。 同样, 可以创建基于连接池定义的DataSource bean, 将其放在另外一个XML文件中, 并标注为qaprofile。 所有的配置文件都会放到部署单元之中(如WAR文件) , 但是只有profile属性与当前激活profile相匹配的配置文件才会被用到。

还可以在根<beans>元素中嵌套定义<beans>元素, 而不是为每个环境都创建一个profile XML文件。 这能够将所有的profile bean定义放到同一个XML文件中, 如下所示
这里写图片描述
除了所有的bean定义到了同一个XML文件之中, 这种配置方式与定义在单独的XML文件中的实际效果是一样的。 这里有三个bean, 类型都是javax.sql.DataSource, 并且ID都是dataSource。 但是在运行时, 只会创建一个bean, 这取决于处于激活状态的是哪个profile。

激活profile
Spring在确定哪个profile处于激活状态时, 需要依赖两个独立的属性: spring.profiles.active和spring.profiles.default。 如果设置了spring.profiles.active属性的话, 那么它的值就会用来确定哪个profile是激活的。 但如果没有设置spring.profiles.active属性的话, 那Spring将会查找spring.profiles.default的值。如果spring.profiles.active和spring.profiles.default均没有设置的话, 那就没有激活的profile, 因此只会创建那些没有定义在profile中的bean。Spring提供了多种方式来设置profile这两个属性:
作为DispatcherServlet的初始化参数;
作为Web应用的上下文参数;
作为JNDI条目;
作为环境变量;
作为JVM的系统属性;
在集成测试类上, 使用@ActiveProfiles注解设置。
在spring.profiles.active和spring.profiles.default中, profile使用的都是复数形式。 意味着可以同时激活多个profile, 可以通过列出多个profile名称, 并以逗号分隔来实现。
下面的程序清单,表示了在web后台为上下文设置激活的active。

<context-param> 
 <param-name>spring.profiles.active</param-name> 
 <param-value>dev</param-value> 
</context-param>

当运行集成测试时, 通常会希望采用与生产环境(或者是生产环境的部分子集) 相同的配置进行测试。 但是, 如果配置中的bean定义在了profile中, 那么在运行测试时, 我们就需要有一种方式来启用合适的profile。Spring提供了@ActiveProfiles注解,可以使用它来指定运行测试时要激活哪个profile。 在集成测试时, 通常想要激活的是开发环境的profile。 例如@ActiveProfiles(“dev”)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值