需求
在文章占位符的使用我们提到了占位符的三个阶段,我们这里来讲讲具体的应用
- 不同环境下applicationContext配置不同
- 不同环境下,图片服务器地址不同
工程结构目录
Profile
在Maven中,有一个选项叫做Profile,它会根据你选的Profile不同,用Profile内的内容合并到当前pom.xml中 参考图片目录绿色部分
如果存在冲突,则以Profile中为准
1 | <profiles> |
从上文的Profile中我们可以看到,我设定了两个环境
- 本地环境
- 生产环境
它们都有一个变量叫做 dev.environment 只不过在不同的环境里,对应的值不同
动态的Build标签
设定好了Profile,我们把占位符文章中的Build稍加修改
1 | <build> |
可以看到我们设定了占位符,通过这种设置,在Maven-Validate阶段会发生如下操作
- 通过选取Profile,Maven把Profile中的标签加载到pom文件
- pom的properties标签中出现 dev.environment
- Maven-Validate第一次替换占位符替换掉了filter中的 ${dev.environment}
准备两份properties文件
由于根据Profile中 dev.environment 的值不同,我们需要两份properties文件 ,这两份文件并不在src目录下,而是在工程的environment文件下 参考目录图片红色部分
- local.properties
1 | env.image.server.disk.root = /Users/Apple/Server/image |
- product.properties
1 | env.image.server.disk.root = /usr/local/nginx/home/8080/static/image |
这两份文件是Maven用来供过滤器使用的,并不会加载到War包的class文件下, 所以并不在resources中
切换applicationContext
由于applicationContext是在工程的resources文件下,即目录src/main/resources/ 参考图片目录黄色部分
所以我们可以通过注释符号,来开启和关闭不同环境下的的功能,比如在Local环境下关闭拦截器,而在Product环境下开启拦截器
1 | <beans> |
如果在Local的Profile下,Maven-Package会把War包中的applicationContext.xml会被替换为注释状态
1 | <beans> |
而在Product的Profile下,Maven-Package会把War包中的applicationContext.xml会被替换为
1 | <beans> |
切换接口地址
另一种情况就是切换接口地址,比如图片服务器的硬盘地址和网络地址,在不同的Profile下是不同的
如果是C相关的语言,我们可以通过宏的define undefine 之类的来完成
Java里没有宏,可以通过Spring读取的properties内容不同来完成
动态的Spring-properties
我们在ApplicationContext的 PropertiesFactoryBean 能读取的文件 upload.properties 中采用动态方式 参考图片目录黄色部分
1 | image.server.disk.root = ${env.image.server.disk.root} |
由于占位符替换的第二步Maven-Package阶段,也会根据Profile不同替换为不同值,然后在代码中,我们可以通过Spring注解给其赋值
1 | @Value("${image.server.disk.root}") |
从而 获得不同的硬盘地址和网络地址