实现自动解析properties文件并装配到bean(代码片段)

陈先生的小板凳 陈先生的小板凳     2022-10-31     688

关键词:

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

思路:

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

 

springbootspringboot自动装配原理解析

...ing的bean可能会覆盖掉自己自定义的bean。所以SpringBoot通过实现一个DeferredImportSelector的接口来实现想要的目的,通过@Import(DeferredImportSelector)实现延迟加载和分组的功能,导入例如带有@ConditionalO 查看详情

spring框架——bean的自动装配不需要手动指定property的value值

1前言bean的自动装配是指:不需要手动指定property的value值,spring自动将匹配的属性注入bean。主要有如下2种方式:bean标签中autowire属性:bean内所有未手动注入的属性将自动匹配并注入,有byType和byName2种匹配方式@Autowire注解:当@A... 查看详情

自动装配任务发送到 Spring TaskExecutor

...布时间】:2013-04-1822:56:59【问题描述】:你怎么会有一个实现Runnable并自动提交给springsTaskExecutor的类?例如,我有一个任务:publicclassMyTaskimplementsRunnable@AutowiredprivateMyRepos 查看详情

使用 application-test.properties 自动装配 Bean

】使用application-test.properties自动装配Bean【英文标题】:AutowireBeanswithapplication-test.properties【发布时间】:2018-07-1610:12:06【问题描述】:我有以下测试类,我的bean总是根据我的src路径中的application.properties自动装配。简单属性已正... 查看详情

Spring 属性(property-placeholder)自动装配

】Spring属性(property-placeholder)自动装配【英文标题】:Springproperties(property-placeholder)autowiring【发布时间】:2011-02-2209:03:07【问题描述】:我的applicationContext.xml中有<context:property-placeholderlocation="classpath*:*.properties"/>& 查看详情

java解析properties文件

...xcel或者json格式来存贮这些数据,但其实java本身就提供了properties类来处理properties文件,虽然名字叫properties,其实打开它发现就是一个记事本的文件,所以看起来也比较直观,下面是解析properties文件的实现代码。properties文件里... 查看详情

使用properties配置文件装配bean的方式(代码片段)

  在spring中将bean注册到spring容器中常见的有三种方式(两类):先说明配置文件内容:application.yml,有一段配置如下persons:youtube:name:youtubeage:18google:name:googleage:20 第一类:将单个类注册到容器中 第一种,使用 @... 查看详情

具有自动装配的字段但得到无法自动装配字段消息

】具有自动装配的字段但得到无法自动装配字段消息【英文标题】:FieldwithautowirebutgetCouldnotautowirefieldmessage【发布时间】:2016-02-2315:01:32【问题描述】:在SpringBoot应用程序中,我收到此错误创建名为“webSecurityConfigurerAdapter”的b... 查看详情

自动装配bean(代码片段)

所谓自动装配,就是将一个Bean注入到其他Bean的Property中,类似于以下:<beanid="customer"class="com.shiyanlou.spring.autowire.common.Customer"autowire="byName"/>Spring支持5种自动装配模式,如下:no——默认情况下,不自动装配,通过refattribute... 查看详情

通过注解实现自定义springbootstarter自动装配

...四、创建提供服务的接口TestService.java五、创建TestService的实现类型TestServiceImpl.java六、创建自定义注解@EnableTest通过以上步骤就实现了自定义Springbootstartertest-spring-boot-starter组件,下面创建测试项目去调用这个starter组件。创建start... 查看详情

spring课程spring入门篇4-6springbean装配之基于java的容器注解说明--@importresource和@valuejava与properties文件交互(代码片段)

...p;1.1  这两个注解应用在什么地方 接口调用,java与properties文件交互获取url和用户名密码等配置信息& 查看详情

@Value 自动装配问题

...么我的自动连线@Value("$delimiter")属性不起作用。框架找到.properties文件,但不映射分隔符属性。Tested.javapublicclassTested@Value("$delimiter")protectedStringdelimiter;Test 查看详情

springboot-自动装配源码解析(代码片段)

文章目录源码流程图getAutoConfigurationEntry源码图地址源码流程图我们找几个比较重要的方法来讲一下getAutoConfigurationEntry主要的功能:进行扫描具有META-INF/spring.factories文件的jar包/** *Returnthe@linkAutoConfigurationEntrybasedonthe@link 查看详情

springboot自动装配(代码片段)

1、自动装配是什么及作用springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理2、spring自动装配的原理2.1、启动... 查看详情

springboot——springboot四大核心之自动装配(源码解析)(代码片段)

...pring-boot-start场景启动器            4.言归正传——自动装配原理            5.总结1.开始首先肯定要说一下SpringBoot的四大核心了:自动装配:简单配置甚至零配置即可运行项目起步依赖࿱ 查看详情

bean装配之注解实现

Spring可以自动检测类并注册Bean到ApplicationContext中。图解:配置<context:component-scan>后component组件会扫描base-package这个包下的所有类,并把相应的信息注入到applicationContext中。图解:这个例子中利用过滤器来有条件的进行扫描... 查看详情

springboot自动装配原理

...一个工具类:SpringFactoriesLoader,@EnableAutoConfiguration就可以实现智能的自动配置。总结:@EnableAutoConfiguration作用就是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应... 查看详情

springboot自动装配以及启动原理解析

---- 查看详情