关键词:
主要实现了,配置的属性就装配, 没有配置的属性不装配
思路:
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自动装配以及启动原理解析
---- 查看详情