实现自动解析properties文件并装配到Bean

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

思路:

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

 

posted @ 2018-04-04 17:29  陈先生的小板凳  阅读(890)  评论(0编辑  收藏  举报