适应各种开发,测试,线上,线下环境的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,这样就可以看到很多有用的信息了。


相关文章
|
17小时前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
7 1
|
2天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
5 0
|
2天前
|
Java Spring
Spring文件配置以及获取
Spring文件配置以及获取
10 0
|
3天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
43 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
8天前
|
Java 微服务 Spring
Spring Boot中获取配置参数的几种方法
Spring Boot中获取配置参数的几种方法
20 2
|
10天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
19 1
|
11天前
|
DataWorks NoSQL 关系型数据库
DataWorks操作报错合集之在使用 DataWorks 进行 MongoDB 同步时遇到了连通性测试失败,实例配置和 MongoDB 白名单配置均正确,且同 VPC 下 MySQL 可以成功连接并同步,但 MongoDB 却无法完成同样的操作如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
29 1
|
12天前
|
Java 开发者 Spring
Spring Boot中的资源文件属性配置
【4月更文挑战第28天】在Spring Boot应用程序中,配置文件是管理应用程序行为的重要组成部分。资源文件属性配置允许开发者在不重新编译代码的情况下,对应用程序进行灵活地配置和调整。本篇博客将介绍Spring Boot中资源文件属性配置的基本概念,并通过实际示例展示如何利用这一功能。
22 1
|
12天前
|
IDE Java 开发工具
Spring Boot DevTools:加速开发的热部署工具
【4月更文挑战第28天】在Spring Boot的开发过程中,快速反馈和效率至关重要。Spring Boot DevTools是一个为开发者设计的模块,支持热部署(hot swapping),能够实现应用的快速重启和自动重载,极大地提高了开发效率。本篇博客将介绍Spring Boot DevTools的核心概念,并通过具体的实战示例展示如何在开发过程中利用这一工具。
22 0
|
15天前
|
存储 Java 数据安全/隐私保护