适应各种开发,测试,线上,线下环境的Spring配置方式

简介: 背景假设开发了一个中间件,比如是一个缓存系统,这个中间件要配置一个IP地址,还要配置一个Factory,从这个Factory里得到一个client,如: 然后这个中间件有三个集群(clusterA, clusterB, clusterC),分别给不同的业务使用,那就这时会有很多的配置的麻烦。

背景

假设开发了一个中间件,比如是一个缓存系统,这个中间件要配置一个IP地址,还要配置一个Factory,从这个Factory里得到一个client,如:

<bean name="cacheFactory" class="com.test.cache.Factory">
    <property name="address" value="192.168.1.100"/>
</bean>
<bean name="cacheClient" factory-bean="cacheFactory" factory-method="getClient" />

然后这个中间件有三个集群(clusterA, clusterB, clusterC),分别给不同的业务使用,那就这时会有很多的配置的麻烦。

  • 从使用者的角度出发,应用不喜欢引入一堆的配置,它们只希望import一个配置文件,然后在代码里用@AutoWried注入一个Bean,就可以使用了。
  • Spring Bean被覆盖的风险。

如果两个不同的业务都使用了这个cache,然后它们的jar包又再被第三个业务引用,那么它们都import了一个cache service的配置,那么就有可能出现后面的Bean定义被前面的覆盖了。而Spring默认不处理这种Bean重复定义的问题。

  • @AutoWried 注入的问题。和上一个问题类似,@AutoWried注入时如果没有配置@Qualifier,那么如果某个类有多个Bean实例,那么就有可能出现Bean注入混乱的情况。
  • 线上环境临时切换。必须要支持线上临时修改配置。
  • 开发者无需配置。要提供默认值的配置,开发者不用做配置就可以直接在本地和测试环境运行代码。
  • 静默发布新版配置。比如当集群迁移了,IP地址变换了,应用不用修改代码和配置,只需要用Maven重新打包即可。

可以利用的技术

spring profile,,@AutoWried,@Qualifier, PropertyPlaceholderConfigurer,PropertyOverrideConfigurer。

profile,PropertyPlaceholderConfigurer等的相关,不一一介绍了。如果有不明白的,可以到spring的文档里参考下。


简要列举下是如何解决上面的问题的。

1.在缓存中间件的jar包里放上三个集群的默认配置:


2.看下spring-cacheClusterA.xm里的内容:

	<beans profile="dev">
		<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">
			<property name="address" value="${cache.address.clusterA:127.0.0.1}"/>
		</bean>
		<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />
	</beans>
	
	<beans profile="test">
		<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">
			<property name="address" value="${cache.address.clusterA:192.168.1.101}"/>
		</bean>
		<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />
	</beans>

	<beans profile="product">
		<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">
			<property name="address" value="${cache.address.clusterA:10.10.1.10}"/>
		</bean>
		<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />
	</beans>	

里面定义了三个profile:dev,test,product。这三个profile分别对应开发,测试,线上三种环境。

而在具体bean的配置上,用了一些"${}"这样的占位符,另外还为它们配置了默认值。

PropertyPlaceholderConfigurer,PropertyOverrideConfigurer可以配置默认值,估计这功能比较少人知道 。

这样就解决了不同环境,还要有默认配置的问题。

3.使用者的使用方法

假定使用者要用到clusterA和clusterB这两个集群,那么可以这样配置:

	<context:property-placeholder location="classpath:env.properties" />

	<import resource="cacheConfigDefault/spring-cacheClusterA.xml" />
	<import resource="cacheConfigDefault/spring-cacheClusterB.xml" />

import了缓存中间件的默认配置,然后还用placeholder加载了一个env.properties的环境变量文件。

那么对于spring-cacheClusterA.xml和spring-cacheClusterB.xml里的address这个属性,如果没有在env.properties里有配置,则会使用默认配置。

如果想要修改,如修改cacheClusterA的配置,则可以在env.properties里加下:

#if comment this, will use the default value
cache.address.clusterA=testClusterAAddress

那么clusterA使用的就是用户的配置,而不是所依赖的jar包的默认配置了。


详细代码

再多详细的代码和配置,可以到这里找到演示的代码:

https://github.com/hengyunabc/spring-config

其它的一些东东

调试spring placeholder时,或者线上查看placeholder到底有没有工作时,可以把spring的log级别调为TRACE,这样就可以看到很多有用的信息了。


相关文章
|
20天前
|
XML 开发框架 Java
Spring轻量级开发框架(二)
Spring轻量级开发框架
43 0
|
1月前
|
开发框架 安全 Java
Spring 框架:企业级应用开发的强大工具
在当今数字化时代,企业级应用开发的需求日益增长。为了满足这一需求,开发者们需要一款功能强大、易于使用的开发框架。Spring 框架作为 Java 领域的领先者,为企业级应用开发提供了全面的解决方案。本文将深入探讨 Spring 框架的各个方面,包括其历史、核心模块、优势以及应用场景。
23 0
|
1月前
|
敏捷开发 运维 测试技术
探索自动化测试在持续集成环境中的关键作用
【2月更文挑战第18天】 随着敏捷开发和DevOps文化的普及,持续集成(CI)已成为软件开发过程中不可或缺的组成部分。本文将深入探讨自动化测试在持续集成环境中的重要性,分析其如何提高软件交付速度、保障质量并减少人工干预。通过对现代软件工程实践中自动化测试策略的剖析,揭示了其在维护高效率和高质量软件产品中的核心地位。
30 7
|
18天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
40 1
|
18天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
40 0
|
1月前
|
敏捷开发 监控 Devops
探索自动化测试在持续集成环境中的关键作用
【2月更文挑战第15天】 本文旨在探讨自动化测试作为软件开发过程中不可或缺的一环,尤其在持续集成(CI)环境中的显著影响。通过深入分析自动化测试的实施策略和最佳实践,文章揭示了如何有效提升软件交付速度和质量。文中不仅讨论了自动化测试的基本概念和框架选择,还详细阐述了其在CI流程中的关键步骤及潜在挑战,并提出了相应的解决方案。
18 4
|
1月前
|
敏捷开发 测试技术 持续交付
探索自动化测试在持续集成环境中的关键作用
【2月更文挑战第15天】 随着敏捷开发和持续集成(CI)实践的普及,自动化测试已成为确保软件质量和加速产品上市速度的核心环节。本文将深入探讨自动化测试在持续集成环境中的重要性,分析其如何提高测试效率,减少人工干预的错误,并实现快速反馈循环。通过案例分析和最佳实践分享,我们将揭示自动化测试策略对提升软件开发流程的影响,以及如何有效地将其整合到现代软件生命周期管理中。
|
11天前
|
jenkins 测试技术 持续交付
软件测试|docker搭建Jenkins+Python+allure自动化测试环境
通过以上步骤,你可以在Docker中搭建起Jenkins自动化测试环境,实现Python测试的自动化执行和Allure报告生成。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
28 6
|
15天前
|
缓存 算法 Java
开发必懂的Spring循环依赖图解 Spring 循环依赖
开发必懂的Spring循环依赖图解 Spring 循环依赖
18 1
|
1月前
|
敏捷开发 监控 数据管理
探索自动化测试在持续集成环境中的关键角色
【2月更文挑战第24天】 在当今软件开发的快节奏环境中,自动化测试不再是一个选择,而是确保产品质量和加速市场交付的必要条件。本文将深入探讨自动化测试在持续集成(CI)环境中的重要性,分析其如何提高测试效率、降低错误率,并最终促进开发流程的持续改进。我们将通过具体的案例研究和最佳实践,揭示自动化测试策略的关键要素,以及如何在CI流程中有效集成自动化测试。