Java配置分离之Spring远程配置
访问我的博客
前言
集群应用的配置文件如果写在项目的 resources 目录下面,当遇到需要修改某一个配置值时,需要将集群的所有应用的配置信息进行修改,并且将机密的配置信息比如数据库账号密码如果不进行加密配置在项目中很危险,一旦发生代码泄露问题,后果很严重。
为了避免上述情况发生,将配置信息存储到数据库中,比如数据库连接、用户名、以及密码,通过 Config 项目的一个接口提供获取配置信息。Config 项目只用于读取配置信息。
远程配置
一)新建类 RemoteProperties
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class RemoteProperties implements InitializingBean, FactoryBean<Properties> {private String url = null;private Properties properties = new Properties();@Overridepublic Properties getObject() throws Exception {return properties;}@Overridepublic Class<?> getObjectType() {return properties.getClass();}@Overridepublic boolean isSingleton() {return true;}@Overridepublic void afterPropertiesSet() throws Exception {loadProperty();}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}private void loadProperty() {if (StringUtil.strIsNull(url)) return;String content = HttpClientUtil.urlGet(url);JSONObject object = JSONObject.parseObject(content);JSONArray data = object.getJSONArray("datasource");for (Object obj : data) {JSONObject jsonObject = (JSONObject) obj;String key = obj.getString("key");String value = obj.getString("value");properties.put(key, value);}}
}
此类用于发送请求获取配置信息,请求返回格式为 JSON 的配置信息, 如:
{"datasource":[{"value":"com.mysql.jdbc.Driver","key":"jdbc.driver"},{"value":"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8","key":"jdbc.url"},{"value":"root","key":"jdbc.username"},{"value":"root","key":"jdbc.password"}]
}
二)编写 Spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><bean id="propertyConfigurerUserServer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="properties"><bean id="remoteProperties" class="com.craft.partner.server.util.RemoteProperties" p:url="http://api.xxx.com/config"/><!--远程配置提供接口--></property><!--还可以加载本地的properties文件--><property name="locations"><list><value>classpath:configure.properties</value></list></property></bean><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"p:driverClass="${jdbc.driver}" p:jdbcUrl="${jdbc.url}"p:user="${jdbc.username}"p:password="${jdbc.password}"><property name="initialPoolSize" value="10" /><property name="minPoolSize" value="10" /><property name="maxPoolSize" value="50" /><property name="maxStatements" value="0" /><property name="maxIdleTime" value="600" /><property name="idleConnectionTestPeriod" value="300" /><property name="acquireIncrement" value="5" /><property name="autoCommitOnClose" value="true" /><property name="checkoutTimeout" value="2000" /></bean><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="find*" read-only="true" /><tx:method name="*" propagation="REQUIRED" read-only="true"/><!--其他不符合规范的方法只允许读操作--></tx:attributes></tx:advice><aop:config expose-proxy="false"><aop:pointcut id="serviceMethod" expression="execution(* com.craft.partner.server.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/></aop:config>
</beans>
注意: 通过 p:url="地址" 的方式,调用 RemoteProperties 的方法,发送请求获取配置信息,通过 Spring 进行注入。
注入后,可以通过 p:属性 的方式获取配置。
参考
- http://www.cnblogs.com/yjmyzz/p/how-to-load-remote-config-in-spring.html
转载于:https://www.cnblogs.com/vcmq/p/9484351.html
Java配置分离之Spring远程配置相关推荐
- java 获取spring对象数组_解析Java中如何获取Spring中配置的bean
解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...
- java避免使用orderby_java – Spring安全配置@Order不是唯一的例外
我试图在我的Spring Security配置中注册多个过滤器,但是我总是得到相同的异常: 04-Nov-2015 14:35:23.792 WARNING [RMI TCP Connection(3 ...
- Java之ssh框架spring配置文件配置定时任务
最近做了一个数据同步功能,要求晚上0点去定时同步数据,这是个老项目框架用的ssh,定时任务基于quartz,废话不多说,下面详细说说相关配置. 在spring的配置文件中: <!-- 0点定时任 ...
- java was datasource_使用Spring Boot配置Druid时dataSource无法被autowired
配置好了dataSource之后,想测试一下有没有配置成功 package com.yang.Controller; import com.alibaba.druid.pool.DruidDataSo ...
- Activiti配置实例以及Spring集成配置
public class TestDB {public static void main(String[] args) {//1. 创建Activiti配置对象的实例ProcessEngineConf ...
- 使用Spring Cloud配置服务器控制配置
一.为什么需要将服务配置与服务代码分开? 在应用开发的过程中,许多开发人员会在应用程序中使用一个或多个常量类文件来将所有的配置集中在一个地方.将应用程序配置数据直接写入代码中通常是有问题的,因为每次对 ...
- apollo配置中心之--spring boot如何加载apollo
文章目录 一.启动类上加入@EnableApollo注解 1.1.PropertySourcesProcessor#initializePropertySources()从apollo服务端拉取配置封 ...
- java数据库连接池选择及开发配置
一.数据库连接池概述 数据库连接的建立是一种耗时.性能低.代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能.数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序需 ...
- spring boot配置mybatis和事务管理
spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...
最新文章
- MySQL count(*)空表为何会很慢
- 锐捷服务器虚拟化技术_数据中心边缘虚拟交换(IEEE 802.1Qbg)技术白皮书
- _INTSIZEOF
- 解决java compiler level does not match the version of the inst
- Java基本开发环境搭建(适合第一次使用)
- Cameralink学习笔记
- soap错误码和获取处理错误码的详细信息
- 网站建设 之 CSS渐变
- 解决VMware虚拟机无法上网
- AddressBook
- python笔记本好_如何使用 Python 分析笔记本电脑上的 100 GB 数据
- MFC更改对话框的背景色
- 观点丨如何让劳动价值像资本一样自由流动与交易
- 房贷流水不够怎么办及假流水办房贷通过了会有风险吗?这真不是危言耸听!
- 如何清空python的IDLE?
- 令人十分期待的ECShopX BBC商城开放终身免费商用
- 1275配对碱基链 1852玛雅文字 +map讲解 (map)
- 爬虫日常-selenium登录12306,绕过验证
- C语言的 d触发器程序,一个带直接置0/1端的D触发器置为0或1有哪几种?
- 天邑600AGM超级密码从这就可以解决-telecomadmin
热门文章
- 已解决:mysql: [Warning] Using a password on the command line interface can be insecure.
- Java static的使用
- git学习(四)比较文件差异diff
- java 1.7图片压缩_appium+java(七)图片的放到及缩小操作
- vivado 如何创建工程模式_用Tcl定制Vivado设计实现流程
- 一年多少钱_赴英读研一年多少钱?
- python getcwd_Python os.getcwd()方法
- 西南交大量子计算机,上海交大“致远学者”本科生突破光量子计算机探测瓶颈问题...
- 查询计算机系的所有教师,用sql查询所有计算机系的教师编号和姓名
- 云服务器上部署pytorch,flask部署pytorch-服务端