Spring如何让代码逻辑与配置项分离?

一、前言

正如webx框架文档里面所说,在一个应用中我们总是会遇到一些参数,例如:数据库服务器IP地址、端口、用户名;这些参数有一个共性,那就是:它们和应用的逻辑无关,只和当前环境、当前系统用户相关。以下场景很常见:

  • 在开发、测试、发布阶段,使用不同的数据库服务器;

  • 在开发阶段,使用Windows的A开发者将用户上传的文件存放在d:\myupload目录中,而使用Linux的B开发者将同样的文件存放在/home/myname/myupload目录中。

  • 在开发阶段设置cache=off,在生产环境中设置cache=on。

很明显,这些参数不适合被“硬编码”在配置文件或代码中。因为每一个从源码库中取得它们的人,都有可能需要修改它们,使之与自己的环境相匹配。本文我们来看看让配置文件与应用逻辑分离几种方法

二、maven filter机制

需要在pom文件里面添加下面配置

<build>	
	
        <filters>	
            <filter>${user.home}/antx.properties</filter>	
        </filters>	
        <resources>	
            <resource>	
                <directory>src/main/resources</directory>	
                <includes>	
                    <include>**.xml</include>	
                </includes>	
                <filtering>true</filtering>	
            </resource>	
        </resources>	
</build>

然后在项目目录执行:mvn resources:resources。则会把项目目录src/main/resources下面的.xml里面的占位符变量${}使用antx.properties配置文件中的变量值进行替换

注意:Maven filter机制在build时刻永久性改变被过滤的配置文件的内容,build结束以后无法更改。这将导致一个问题:如果要改变配置文件的参数,必须获取源码并重新build。

二、AutoConfig机制

首先需要在pom添加如下:

            <plugin>	
                <groupId>com.alibaba.citrus.tool</groupId>	
                <artifactId>autoconfig-maven-plugin</artifactId>	
                <version>1.2</version>	
                <configuration>	
                    <dest>src/main/resources/</dest>	
                </configuration>	
                <executions>	
                    <execution>	
                        <phase>package</phase>	
                        <goals>	
                            <goal>autoconfig</goal>	
                        </goals>	
                    </execution>	
                </executions>	
            </plugin>

项目目录如下:640?wx_fmt=png

然后下载autoconfig二进制包: http://repo1.maven.org/maven2/com/alibaba/citrus/tool/antx-autoconfig/1.2/antx-autoconfig-1.2.tgz下载后解压,添加bin目录到环境变量

然后执行 autoconfig jar包,会提示你替换jar里面的配置文件,然后jar里面的配置文件内容会被修改。640?wx_fmt=png

注:AutoConfig不需要重新build源码,就可以改变目标jar文件中所有配置文件中placeholders的值。

三、PropertyPlaceholderConfigurer

上面两种都是在非运行态进行替换的,PropertyPlaceholderConfigurer则是在运行态对占位符进行替换

640?wx_fmt=png

640?wx_fmt=png

注意:这种是在运行时进行替换。

四、Springboot机制

pom添加下面插件

<plugin>	
                <groupId>org.springframework.boot</groupId>	
                <artifactId>spring-boot-maven-plugin</artifactId>	
                <version>${spring-boot.version}</version>	
                <configuration>	
                    <executable>false</executable>	
                    <excludeDevtools>true</excludeDevtools>	
                </configuration>	
                <executions>	
                    <execution>	
                        <goals>	
                            <goal>repackage</goal>	
                        </goals>	
                    </execution>	
                </executions>	
</plugin>

执行打包后,使用:jar -jar jar包 --spring.config.location=antx.properties执行 注: 这种做到了应用部署包和配置完全分离,是比较好的一种方式。

最后 Java并发编程之美欢迎订购

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

最后单击下方 阅读原文 进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值