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


相关文章
|
6月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
7102 90
|
7月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
7月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2485 0
|
6月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
6月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1314 5
|
7月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
378 0
探索Spring Boot的@Conditional注解的上下文配置
|
7月前
|
存储 测试技术 API
数据驱动开发软件测试脚本
今天刚提交了我的新作《带着ChatGPT玩转软件开发》给出版社,在写作期间跟着ChatGPT学到许多新知识。下面分享数据驱动开发软件测试脚本。
275 0
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
10月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1409 23
下一篇
开通oss服务