主要实现了,配置的属性就装配, 没有配置的属性不装配

思路:

1 . 通过反射获取类内部所有方法名称

2 . 获取perperties 的key集合

3 .  处理字符串,比较两个匹配,如果匹配成功就使用Method.invoke()方法 , 执行匹配成功的方法

JAVA代码

 package bingosoft.metro.xmgl.cx.redisUtil;

 import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Properties; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; /**
*
* @作者 陈祥
* @创建时间 2018年4月4日
* @功能描述 配置项目级监听, 在项目启动的时候加载redis配置文件,
* 装配jedis控制参数 和jedis池
*/
@WebListener
public class LoadRedisConfListener implements ServletContextListener { /**
* 配置文件地址
*/
private final String PROPERTIES_PATH = "/redis.properties"; //contextDestroyed
@Override
public void contextDestroyed(ServletContextEvent arg0) { } /**
* 项目启动
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("-------监听启动,开始装配redis---------------"); JedisPoolConfig poolConfig = new JedisPoolConfig(); //读取配置文件 , 获取Properties 对象
Properties pro = loadProperties(PROPERTIES_PATH); //根据配置文件装配 poolConfig 的参数
try {
setPoolConfigValue(poolConfig, pro);
} catch (Exception e) {
e.printStackTrace();
} //初始化redis池
initPool(poolConfig, pro); System.out.println("-------装配redis结束---------------");
} /**
* 根据配置信息 , 初始化redis池(RedisClient.pool)
*/
private void initPool(JedisPoolConfig poolConfig,Properties pro ){
//获取配置信息
//必须配置 host port
String host = pro.getProperty("redis_host");
int port = new Integer(pro.getProperty("redis_port"));
//选择配置 timeout password
String t = pro.getProperty("redis_timeout") ;
int timeout;
String password = pro.getProperty("redis_password"); if(t != null ){
timeout = new Integer( t);
if(password == null){
RedisClient.pool = new JedisPool(poolConfig, host, port, timeout);
}
if(password !=null){
RedisClient.pool = new JedisPool(poolConfig, host, port, timeout, password);
} }else{
RedisClient.pool =new JedisPool(poolConfig, host, port);
}
}
/**
* 读取配置信息
*/
private static Properties loadProperties(String path){
//创建配置文件实体
Properties pro = new Properties();
try {
//加载文件
pro.load(new LoadFile().getClass().getResourceAsStream(path));
} catch (IOException e) {
System.out.println("--ERRER-redis配置文件没找到,请在/resources目录下创建redis.properties");
}
return pro ;
} /**
* 根据配置信息,装配poolConfig
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
private static JedisPoolConfig setPoolConfigValue(JedisPoolConfig poolConfig,Properties pro) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
//获取配置所有配置名称
Enumeration<String> propertyNames = (Enumeration<String>) pro.propertyNames(); //类路径
String path = "redis.clients.jedis.JedisPoolConfig";
Class clazz = Class.forName(path); //获取所有public方法
Method[] methods = clazz.getMethods(); //循环便利
while(propertyNames.hasMoreElements()){
String ppname = propertyNames.nextElement();
/*
redis_port
redis_host
redis_auth
*/
//截取字符串
String newName = ppname.substring(ppname.indexOf("_")+1, ppname.length());
//首字符大写
String s = newName.substring(0,1).toUpperCase();
//拼接出方法名 mName
String mName = "set"+s + ppname.substring(ppname.indexOf("_")+2,ppname.length()); for (Method method : methods) {
//如果有这个方法
if(method.equals(mName)){
//如果配置的有值,一般都有值
if( null!= pro.get(ppname)){
//设置值
method.invoke(poolConfig, pro.get(ppname));
}
}
}
}
return poolConfig ;
}
}

配置文件代码

 # ip
redis_host=127.0.0.1
# 端口号
redis_port=6379
# 设置连接域
#redis_auth=test123
#控制一个pool可分配多少个jedis实例,如果赋值为-1,表示不限制
redis_maxActive=1024
#控制一个pool最多有多少个状态为idle的jedis实例;
redis_maxIdle=200
#最大的等待时间,如果超过等待时间
redis_maxWait=10000
#是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis_testOnBorrow=true
#----------------------------------------------------
#在return给pool时,是否提前进行validate操作;
#redis_testOnReturn
#如果validate失败,此object会被从pool中drop掉;
#redis_testWhileIdle
#表示idle object evitor两次扫描之间要sleep的毫秒数;
#redis_timeBetweenEvictionRunsMillis
#表示idle object evitor每次扫描的最多的对象数;
#redis_numTestsPerEvictionRun
#表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;
#redis_minEvictableIdleTimeMillis
#redis_softMinEvictableIdleTimeMillis
#redis_lifo:borrowObject

实现自动解析properties文件并装配到Bean的更多相关文章

  1. java解析properties文件

    在自动化测试过程中,经常会有一些公用的属性要配置,以便后面给脚本使用,我们可以选择xml, excel或者json格式来存贮这些数据,但其实java本身就提供了properties类来处理proper ...

  2. Python:解析properties文件

    在项目中遇到解析properties的情况,而Python中正好没有解析properties文件的现成模块,于是从网上找到了这个脚本,有一些小地方修改了一下 原博客: Python读写properti ...

  3. Spring自动注入properties文件

    实现spring 自动注入属性文件中的key-value. 1.在applicationContext.xml配置文件中,引入<util />命名空间. xmlns:util=" ...

  4. Dom4J解析xml文件动态转换为List<Bean>或者Map集合

    大家在解析大量相似xml文件的时候是否会遇到这样一个问题:冗余的代码去set定义的实体对象Bean的值,基本都是一样的操作   而且毫无任何代码价值可言所以在这写了一个简单的例子,类封装了几个方法你只 ...

  5. 解析Properties文件

    /** * 传入需要解析的文件属性,传入文件的路径 * @param para 需要获取的属性名称.也就是键值对中的键名称 * @param filepath * @return */ public ...

  6. springboot 2.1.3.RELEASE版本解析.properties文件配置

    1.有时为了管理一些特定的配置文件,会考虑单独放在一个配置文件中,如redis.properties: #Matser的ip地址 redis.host=192.168.5.234 #端口号 redis ...

  7. 读取并解析properties文件

    public class SysConfig { private static final Properties properties = new Properties(); static{ Reso ...

  8. maven 项目打包时无法解析读取properties文件

    在做项目时遇见一个问题,无法解析properties文件的 内容 异常为 Could not resolve placeholder ......... 在此之前均有做相关的 配置 但是从未出现过如上 ...

  9. 自定义Yaml解析器替换Properties文件

    自定义Yaml解析器替换Properties文件 项目结构 案例代码 配置类SpringConfiguration @Configuration @Import(JdbcCofnig.class) @ ...

随机推荐

  1. ASPxTreeList的右键按钮事件

    ASPxTreeList应该是比较长用的控件了~现在就来说说它的右键按钮事件 这里实现的是右键里有折合和展开所有节点的功能 code: <dx:ASPxTreeList ID="ASP ...

  2. [ python ] 项目一:FTP程序

    声明: 该项目参考学习地址: http://www.cnblogs.com/lianzhilei/p/5869205.html , 感谢博主分享,如有侵权,立即删除. 作业:开发一个支持多用户在线的F ...

  3. 【Android开发日记】之基础篇(一)——TextView+SpannableStringBuilder

    TextView是控件中最最基础的一个控件,也是最简单的一个控件.但如果仅此,我不会专门为TextView写一篇文章.最近发现了Android中有趣的一个类,那就是标题上写的SpannableStri ...

  4. Ta-Lib用法介绍 !

    一.函数索引 重叠研究 BBANDS Bollinger Bands DEMA Double Exponential Moving Average EMA Exponential Moving Ave ...

  5. hdu 1024(滚动数组+动态规划)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. SEO:查找网站的百度收录情况和如何让百度快速收录

    查询收录的工具地址: http://tool.chinaz.com/baidu/entry/ 如何让百度快速收录: 一.大家都熟知的百度网站提交,只需要提交网站的首页即可.以前做完这一步就被百度收录的 ...

  7. AC日记——[POI2014]KUR-Couriers 洛谷 P3567

    [POI2014]KUR-Couriers 思路: 卡空间,sb题: 代码: #include <bits/stdc++.h> using namespace std; #define m ...

  8. 云平台学习--GitLab

    今天和师父还有孙老师一起,两位大神给我讲了下全世界最先进的云平台架构(Tigzx). 废话不多说,直接说代码的GitLab 第一步: 访问路径:http://git.dlanqi.com:30503, ...

  9. lvm笔记

    安装LVMyum -y install lvm* 创建PV# pvcreate /dev/md5 /dev/sdf1 /dev/sdg 查看PV# pvdisplay 还可以使用命令pvs 和pvsc ...

  10. nodejs pm2使用

    参考地址:http://www.jianshu.com/p/43525232b03b 参考地址:http://blog.csdn.net/leo_perfect/article/details/536 ...