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

思路:

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. CSS原生布局方式

    前言 网页原生布局的方法其实网上有很多,大概为Flow(流动布局模型).Float(浮动布局模型).Layer(层级布局模型).<!--more--> Flow布局 流动布局模型其实就是默 ...

  2. HTML 知识点总结

    HTML基本语法 HTML标签 单标签 <标签名>或<标签名 /> 双标签 <标签名>内容</标签名> 跟标签也叫元素(根元素) 属性 属性属于标签 一 ...

  3. SRM 638 Div.2

    250 给一个字符串 要求从一种形式换成另一形式 class NamingConvention{ private: int a, b, c; public: int d; string toCamel ...

  4. linux命令(7):ipcs/ipcrm命令

    ipcs作用 :查看消息队列(ipcs –q).共享内存(ipcs –m).信号灯(ipcs -s) ipcrm作用 :删除消息队列.共享内存.信号灯 ipcrm使用方式: ipcrm [ -M ke ...

  5. 多路复用I/O模型epoll() 模型 代码实现

    epoll模型 int epoll_create(int maxevent) //创建一个epoll的句柄 然后maxevent表示监听的数目的大小int epoll_ctl(int epollfd, ...

  6. Mybatis学习—入门

    总结自 Mybatis官方中文文档 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手 ...

  7. 【原创】IIS7.5优化,支持同时10万个请求

    背景 IIS7.5是微软推出的最新平台IIS,性能也较以前有很大的提升,但是默认的设置配不适合很大的请求.但是我们可以根据实际的需要进行IIS调整,使其性能更佳,支持同时10万个请求. 以下方案,通过 ...

  8. [loj#2566][BZOJ5333] [Sdoi2018]荣誉称号 树形dp

    #2566. 「SDOI2018」荣誉称号   休闲游戏玩家小 Q 不仅在算法竞赛方面取得了优异的成绩,还在一款收集钻石的游戏中排名很高. 这款游戏一共有 n 种不同类别的钻石,编号依次为 1 到 n ...

  9. 转:攻击JavaWeb应用[5]-MVC安全

    转:http://static.hx99.net/static/drops/tips-347.html 攻击JavaWeb应用[5]-MVC安全 园长 · 2013/07/25 13:31 注:这一节 ...

  10. 【linux入门必备】小白需要掌握的基础知识_不定期更新

    因为博主对linux掌握暂时不需要太精通,遇到一个记录一个. 零碎 知识点: 杂类常用命令: 模糊匹配补齐 TAB 系统相关命令: 查阅手册 man 更新软件 sudo apt-get update ...