主要实现了,配置的属性就装配, 没有配置的属性不装配
思路:
1 . 通过反射获取类内部所有方法名称
2 . 获取perperties 的key集合
3 . 处理字符串,比较两个匹配,如果匹配成功就使用Method.invoke()方法 , 执行匹配成功的方法
JAVA代码
1 package bingosoft.metro.xmgl.cx.redisUtil; 2 3 import java.io.IOException; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.InvocationTargetException; 6 import java.lang.reflect.Method; 7 import java.util.Enumeration; 8 import java.util.Properties; 9 10 import javax.servlet.ServletContextEvent; 11 import javax.servlet.ServletContextListener; 12 import javax.servlet.annotation.WebListener; 13 14 import redis.clients.jedis.JedisPool; 15 import redis.clients.jedis.JedisPoolConfig; 16 17 /** 18 * 19 * @作者 陈祥 20 * @创建时间 2018年4月4日 21 * @功能描述 配置项目级监听, 在项目启动的时候加载redis配置文件, 22 * 装配jedis控制参数 和jedis池 23 */ 24 @WebListener 25 public class LoadRedisConfListener implements ServletContextListener { 26 27 /** 28 * 配置文件地址 29 */ 30 private final String PROPERTIES_PATH = "/redis.properties"; 31 32 //contextDestroyed 33 @Override 34 public void contextDestroyed(ServletContextEvent arg0) { 35 36 } 37 38 /** 39 * 项目启动 40 */ 41 @Override 42 public void contextInitialized(ServletContextEvent arg0) { 43 System.out.println("-------监听启动,开始装配redis---------------"); 44 45 JedisPoolConfig poolConfig = new JedisPoolConfig(); 46 47 //读取配置文件 , 获取Properties 对象 48 Properties pro = loadProperties(PROPERTIES_PATH); 49 50 //根据配置文件装配 poolConfig 的参数 51 try { 52 setPoolConfigValue(poolConfig, pro); 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } 56 57 //初始化redis池 58 initPool(poolConfig, pro); 59 60 System.out.println("-------装配redis结束---------------"); 61 } 62 63 /** 64 * 根据配置信息 , 初始化redis池(RedisClient.pool) 65 */ 66 private void initPool(JedisPoolConfig poolConfig,Properties pro ){ 67 //获取配置信息 68 //必须配置 host port 69 String host = pro.getProperty("redis_host"); 70 int port = new Integer(pro.getProperty("redis_port")); 71 //选择配置 timeout password 72 String t = pro.getProperty("redis_timeout") ; 73 int timeout; 74 String password = pro.getProperty("redis_password"); 75 76 if(t != null ){ 77 timeout = new Integer( t); 78 if(password == null){ 79 RedisClient.pool = new JedisPool(poolConfig, host, port, timeout); 80 } 81 if(password !=null){ 82 RedisClient.pool = new JedisPool(poolConfig, host, port, timeout, password); 83 } 84 85 }else{ 86 RedisClient.pool =new JedisPool(poolConfig, host, port); 87 } 88 } 89 /** 90 * 读取配置信息 91 */ 92 private static Properties loadProperties(String path){ 93 //创建配置文件实体 94 Properties pro = new Properties(); 95 try { 96 //加载文件 97 pro.load(new LoadFile().getClass().getResourceAsStream(path)); 98 } catch (IOException e) { 99 System.out.println("--ERRER-redis配置文件没找到,请在/resources目录下创建redis.properties"); 100 } 101 return pro ; 102 } 103 104 /** 105 * 根据配置信息,装配poolConfig 106 * @throws ClassNotFoundException 107 * @throws SecurityException 108 * @throws NoSuchMethodException 109 * @throws InvocationTargetException 110 * @throws IllegalArgumentException 111 * @throws IllegalAccessException 112 */ 113 private static JedisPoolConfig setPoolConfigValue(JedisPoolConfig poolConfig,Properties pro) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ 114 //获取配置所有配置名称 115 Enumeration<String> propertyNames = (Enumeration<String>) pro.propertyNames(); 116 117 //类路径 118 String path = "redis.clients.jedis.JedisPoolConfig"; 119 Class clazz = Class.forName(path); 120 121 //获取所有public方法 122 Method[] methods = clazz.getMethods(); 123 124 //循环便利 125 while(propertyNames.hasMoreElements()){ 126 String ppname = propertyNames.nextElement(); 127 /* 128 redis_port 129 redis_host 130 redis_auth 131 */ 132 //截取字符串 133 String newName = ppname.substring(ppname.indexOf("_")+1, ppname.length()); 134 //首字符大写 135 String s = newName.substring(0,1).toUpperCase(); 136 //拼接出方法名 mName 137 String mName = "set"+s + ppname.substring(ppname.indexOf("_")+2,ppname.length()); 138 139 for (Method method : methods) { 140 //如果有这个方法 141 if(method.equals(mName)){ 142 //如果配置的有值,一般都有值 143 if( null!= pro.get(ppname)){ 144 //设置值 145 method.invoke(poolConfig, pro.get(ppname)); 146 } 147 } 148 } 149 } 150 return poolConfig ; 151 } 152 }
配置文件代码
1 # ip 2 redis_host=127.0.0.1 3 # 端口号 4 redis_port=6379 5 # 设置连接域 6 #redis_auth=test123 7 #控制一个pool可分配多少个jedis实例,如果赋值为-1,表示不限制 8 redis_maxActive=1024 9 #控制一个pool最多有多少个状态为idle的jedis实例; 10 redis_maxIdle=200 11 #最大的等待时间,如果超过等待时间 12 redis_maxWait=10000 13 #是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的; 14 redis_testOnBorrow=true 15 #---------------------------------------------------- 16 #在return给pool时,是否提前进行validate操作; 17 #redis_testOnReturn 18 #如果validate失败,此object会被从pool中drop掉; 19 #redis_testWhileIdle 20 #表示idle object evitor两次扫描之间要sleep的毫秒数; 21 #redis_timeBetweenEvictionRunsMillis 22 #表示idle object evitor每次扫描的最多的对象数; 23 #redis_numTestsPerEvictionRun 24 #表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐; 25 #redis_minEvictableIdleTimeMillis 26 #redis_softMinEvictableIdleTimeMillis 27 #redis_lifo:borrowObject