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

思路:

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. python windows下安装celery调度任务时出错

    由于celery 4.0不支持windows系统.所以用命令pip install Celery安装的celery是最新版4.0的不能在windows下运行. 在windows命令窗口运行: cele ...

  2. mac10.9下安装Android

    这里记录一下mac下安装android比较快捷的方法 首先,到这里下载Android SDK,这个是集成的,所有工具一应俱全,免去了下载一堆东西的烦恼.具体包括如下: Eclipse + ADT pl ...

  3. C++中多线程与Singleton的那些事儿

    前言 前段时间在网上看到了个的面试题,大概意思是如何在不使用锁和C++11的情况下,用C++实现线程安全的Singleton. 看到这个题目后,第一个想法就是用Scott Meyer在<Effe ...

  4. 在 Visual Studio 中使用正则表达式

    Visual Studio 使用 .NET framework 正则表达式查找和替换文本. 在 Visual Studio 2010 和早期版本中,Visual Studio 在“查找和替换”窗口中使 ...

  5. Container With Most Water——双指针

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  6. css3之nth-child和nth-of-type的区别

    之前一直开发的是兼容老版本的代码,所以很少用到有关c3里面的代码格式,今天就对于使用的c3选择器中nth-child和nth-of-type做一个区分.首先:1.nth-child(n):是选择父级元 ...

  7. Linux上安装MongoDB

    使用本教程使用.rpm 软件包在红帽企业Linux或CentOS Linux版本6和7上安装MongoDB Community Edition . 平台支持 本安装指南仅支持64位系统.详细信息请参见 ...

  8. CSS3主要的几个样式笔记

    1.边框:border-color:    设置对象边框的颜色.     使用CSS3的border-radius属性,如果你设置了border的宽度是X px,那么你就可以在这个border上使用X ...

  9. 编写.gitignore 文件

    讲代码 放入 Git 仓库中进行版本控制管理时,有些文件是不需要放入Git 中,比如 Maven 生成的target 目录,IDEA/Eclipse的工程文件, 在项目的根目录 下 添加一个名为.gi ...

  10. ZSTU OJ 4272 最佳淘汰算法

    线段树. 处理出每个位置下一个位置是哪里.然后搞个线段树找一下最大值就可以了. #include<map> #include<set> #include<ctime> ...