在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常。
一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理。
此处是一个jedis工厂类的代码:
public class JedisFactory implements ApplicationListener<ApplicationEvent> { private static Logger logger = LogHelper.LOG_CollectDataService; private static JedisPoolConfig jedisPoolConfig; private static JedisPool jedisPool; private static boolean isStart = false; @Value("${redis.maxActive}") private String maxActive; @Value("${redis.maxIdle}") private String maxIdle; @Value("${redis.maxWait}") private String maxWait; @Value("${redis.ip}") private String host; @Value("${redis.port}") private String port; @Override public void onApplicationEvent(ApplicationEvent event) { if (!isStart) { isStart = true; try { jedisPoolConfig = new JedisPoolConfig(); // 最大连接数 jedisPoolConfig.setMaxActive(Integer.parseInt(maxActive)); // 最大空闲连接数 jedisPoolConfig.setMaxIdle(Integer.parseInt(maxIdle)); // 获取连接最大等待时间 jedisPoolConfig.setMaxWait(Integer.parseInt(maxWait)); // 设置获取连接前是否进行连接测试 jedisPoolConfig.setTestOnBorrow(true); jedisPool = new JedisPool(jedisPoolConfig, host, Integer.parseInt(port)); logger.info("JedisPool 已初始化, ", JSON.toJSONString(jedisPool)); } catch (Exception e) { logger.error("JedisPool 初始化异常", e); } } } public static Jedis getJedis() { Jedis jedis = null; try { logger.info("jedisPool = ", jedisPool.toString()); jedis = jedisPool.getResource(); return jedis; } catch (Exception e) { logger.error("获取Jedis实例异常", e); jedisPool.returnBrokenResource(jedis); return null; } } /** * 将jedis对象释放回连接池中 * * @param jedis 使用完毕的Jedis对象 * @return true 释放成功;否则返回false */ public static boolean release(Jedis jedis) { if (jedis != null) { jedisPool.returnResource(jedis); return true; } return false; } }
相关推荐
Spring Bean创建初始化流程
本篇文章主要介绍了Spring 中如何控制2个bean中的初始化顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
spring的初始化,可以让初学者了解soring的开发过程,让开发轻松进入开发大门。
beanFactory.preInstantiateSingletons()的初始化过程详解,包含了所有的调用过程。
3、通过spring的xml bean配置或bean注解指定初始化方法,如下面实例的initMethod方法通过@bean注解指定。 销毁的时候实现的方法 1、通过java提供的@PreDestroy注释; 2、通过实现spring提供的DisposableBean接口,并...
SpringBoot项目启动时实现调用一次初始化方法
Spring的IoC容器初始化源码解析,包括资源定位、加载、注册3个过程
初始化后可访问Spring管理的Bean
spring配置对象实例化后执行的方法,两种实现比对,通过InitializingBean接口,并实现arterPropertiesSet()方法;或者通过applicationContext.xml配置init-method属性
主要介绍了Spring Bean的初始化和销毁,结合实例形式详细分析了Spring Bean的初始化和销毁相关配置、使用方法及操作注意事项,需要的朋友可以参考下
干净的spring初始化工程,包含ioc,di,datasource,但是不包含aop
Spring 延迟实例化
主要介绍了Spring初始化和销毁的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
下面小编就为大家带来一篇浅谈spring容器中bean的初始化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
附件是在Spring Boot项目中使用CommandLineRunner接口来执行一些资源初始化的演示,该文档也详细的介绍了在@Component注解的类中可以注入@Controller,并把获取的数据存放到其他Bean类中的私有静态变量,算是对自己...
主要给大家介绍了Spring中如何初始化泛型类,文中给出详细的介绍和方法实例,对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考学习,下面来一起看看吧。
Spring源码学习六:bean初始化1
Spring 源码分析(Bean的初始化) 前言 本篇文章是个人第一次看spring源码并总结,同时也参考了下面这篇博客。基本也是按照他的思路来理解的。这也算是第一版个人简易理解。也算是窥见spring的冰山一角,之后也会...
spring-boot-initscript, Spring Boot 项目的初始化脚本 Spring Boot init.d-脚本注意:在 Spring Boot 1.3中,有可能在打包的. jar 文件的前面注入正式的init.d 脚本。 指令在文档中找到了 这个脚本用于将一个...
本文结合OA项目,介绍ssh框架所遇到的核心问题,包含登录时数据初始化设置,hibernate懒加载处理,structs2对权限的拦截处理,jsp页面传值EL和ONGL表达式的介绍