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

思路:

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. java 和 JVM

    C++和Java的区别 指针:java中不存在指针的概念,编程者无法直接通过指针来直接访问内存,有利于维护java程序的安全 多重继承:C++支持多重继承,java不支持多重继承,但是允许一个类继承多 ...

  2. 安装:python+webdriver环境

    安装:python+webdriver环境第一步:安装active-python,双击可执行文件,直接默认安装即可.第二步:安装selenium webdriver1. 打开cmd2. 命令为:pip ...

  3. Webstorm和Eclipse常用快捷键

    快捷键配置 点击“File”-> “settings” Webstorm预置了其他编辑器的快捷键配置,可以点击 默认配置-Eclipse的常用快捷键对照表 查找/代替 Webstorm快捷键 E ...

  4. poj 1579(动态规划初探之记忆化搜索)

    Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17843   Accepted: 9112 ...

  5. hdu 1133(卡特兰数变形)

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133   题意:排队买50块一张的票,初始票台没有零钱可找,有m个人持有50元,n人持有100元, ...

  6. ELK日志处理

    ELK的工作原理: 使用多播进行机器发现同一个集群内的节点,并汇总各个节点的返回组成一个集群,主节点要读取各个节点的状态,在关键时候进行数据的恢复,主节点会坚持各个节点的状态,并决定每个分片的位置,通 ...

  7. 197. Rising Temperature

    Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...

  8. EF6 Working with Proxies ProxyCreationEnabled

    When creating instances of POCO entity types, the Entity Framework often creates instances of a dyna ...

  9. 通过url判断当前页,动态给导航加样式

    //通过url判断当前页,动态给导航加样式 var str =location.pathname; var index = str.lastIndexOf("\/"); str = ...

  10. 【解决】win7 64 pip安装scrapy出错

    问题一:microsoft visual c++ 9.0 is required 参考:http://www.cnblogs.com/ldm1989/p/4210743.html 问题二:ERROR: ...