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

思路:

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. Filecoin:一种去中心化的存储网络(二)

    开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...

  2. vue 文件引入1

    直接 <script> 引入 直接下载并用 <script> 标签引入,Vue 会被注册为一个全局变量.重要提示:在开发时请用开发版本,遇到常见错误它会给出友好的警告. 开发环 ...

  3. linux命令(27):cat命令

    实例一:把 log2012.log 的文件内容加上行号后输入 log2013.log 这个文件里 cat -n log2012.log log2013.log 实例二:把 log2012.log 和 ...

  4. [PAT] 1021 Deepest Root (25)(25 分)

    1021 Deepest Root (25)(25 分)A graph which is connected and acyclic can be considered a tree. The hei ...

  5. %和format的区别

    在python中字符串的格式化分为两种:%和format.那么我们在什么时候来使用它们呢?它们有什么区别呢? 举个例子:我们根据一个坐标来表示一个动作 #定义一个坐标 point = (250,250 ...

  6. react初体验

    function Guest() { return ( <h1>pls login in</h1> ); } function User() { return ( <h1 ...

  7. LoadRunner Agent Runtime Settings Configuration启动报错

    解决方法: 关闭负载机器上的防火墙功能即可解决

  8. lazarus安装

    https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20amd64%20DEB/Lazarus%201.6.4/ 下载这三个文 ...

  9. NBUT 1220 SPY

    $map$,简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<algorit ...

  10. Queries for Number of Palindromes (区间DP)

    Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabytes ...