如何在Spring中动态设置bean引用?

             

在上面的场景中,bean MyBeanconfig属性从环境变为环境。 在开发时,配置的引用更改为dev 。 在分期中,参考变为stag 。 在弹出文件中检查时出现问题。 我们必须在每次检查之前分析配置的引用。如果配置的引用与dev的值签入,我们可能需要解释很多问题。

是否有任何解决方案可以使其自动化?
注意:Spring版本是2.0.1

使用Spring的PropertyPlaceholderConfigurer,删除一个未使用的bean:

   env.properties           

和env.properties文件包含以下属性:

 x=Dev1 y=Dev2 z=Dev3 

要么

 x=Stag1 y=Stag2 z=Stag3 
  1. 通过specfiy设置占位符bean,让spring知道你想要占位符
  2. 使用“$ {env}”设置“my bean”的配置

例如:

   env.properties      

并且您需要将env = dev键值添加到env.properties文件中

假设您的意思是Spring 3.1,而不是Spring 2.1(不存在),那么您可以使用3.1中引入的新“环境配置文件”function。 这允许您为每个环境定义一组bean,然后在运行时选择“活动”bean。

有关示例,请参阅此SpringSource博客条目 。

您可以使用PropertyPlaceholderConfigurer或使用@Profile

另见

  • 是-有-任何路到使能或停用function最弹簧豆定义function于applicationc
  • PropertyPlaceholderConfigurer示例

PropertyPlaceholderConfigurer就是答案,但我想你可以在不需要为每个环境更新属性文件的情况下实现这一点。

因此,我的建议如下

  1. 使用PropertyPlaceholderConfigurer ,但不要创建属性文件
  2. 默认情况下, PropertyPlaceholderConfigurer首先尝试在属性文件中查找值,但如果失败, 它将在系统属性中查找一个值

所以你需要做的就是以同样的方式定义两个bean,即devstag ..这是一个很好的方法,因为你清楚地显示了不同的配置…如果你还添加它会有所帮助一些别名可以清楚地显示您要使用的设置。

接下来,传入一个系统属性,定义您所处的模式…并理想地将PropertyPlaceholderConfigurer设置为使用系统属性。

所以..你的配置看起来像这样

               

然后,您可以在启动时以下列方式传入属性

 -D= 

所以在这种情况下你会使用

 -Dlaunch.mode=dev_mode 

要么

 -Dlaunch.mode=staging_mode 

而且您不需要触摸任何配置文件。

关于systemPropertiesMode的另一个注释,接受的值如下:

  • 0 – 永远不要查看系统属性
  • 1 – 使用系统属性作为后备(即如果在属性文件中找不到)
  • 2 – 系统属性总是覆盖(我建议的模式)

希望能帮助到你 :)

注意:此建议仅适用于Spring <3.1,因为从3.1开始,推荐的方法是使用@Profile

Spring提供了一种称为属性占位符的机制。 这样,您可以在数据库/属性文件中设置某些属性,spring将在启动时填充它们。

用于此的类位于此处 。