zoukankan      html  css  js  c++  java
  • 实现自动解析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
  • 相关阅读:
    浅析 c# Queue
    c# Stack操作类
    delegate,event, lambda,Func,Action以及Predicate
    推翻MMSOA与WEBService,使用MEMBRANE soap Monitor检查 wsdl文件。
    JS打印表格(HTML定义格式)
    坑爹的META 刷新页面 框架页面中TOP页面提示刷新 meta元素设置而不基于 JS 的坑爹写法。
    Silverlight载入动画(简易)
    WPF先开了再说
    跨域WEB Service 调用(摘自ASP.NET高级编程第三版)
    安装程序找不到Office.zhcn\OfficeMUI问题
  • 原文地址:https://www.cnblogs.com/cx987514451/p/8718418.html
Copyright © 2011-2022 走看看