你的位置:首页 > ASP.net教程

[ASP.net教程]Spring 初始化2次的问题


在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常。

 

一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理。

 

此处是一个jedis工厂类的代码:

 

1.public class JedisFactory implements ApplicationListener<ApplicationEvent> { 2.  private static Logger logger = LogHelper.LOG_CollectDataService; 3. 4.  private static JedisPoolConfig jedisPoolConfig; 5. 6.  private static JedisPool jedisPool; 7. 8.  private static boolean isStart = false; 9. 10.  @Value("${redis.maxActive}") 11.  private String maxActive; 12. 13.  @Value("${redis.maxIdle}") 14.  private String maxIdle; 15. 16.  @Value("${redis.maxWait}") 17.  private String maxWait; 18. 19.  @Value("${redis.ip}") 20.  private String host; 21. 22.  @Value("${redis.port}") 23.  private String port; 24. 25.  @Override 26.  public void onApplicationEvent(ApplicationEvent event) { 27.    if (!isStart) { 28.      isStart = true; 29. 30.      try { 31.        jedisPoolConfig = new JedisPoolConfig(); 32. 33.        // 最大连接数 34.        jedisPoolConfig.setMaxActive(Integer.parseInt(maxActive)); 35.        // 最大空闲连接数 36.        jedisPoolConfig.setMaxIdle(Integer.parseInt(maxIdle)); 37.        // 获取连接最大等待时间 38.        jedisPoolConfig.setMaxWait(Integer.parseInt(maxWait)); 39.        // 设置获取连接前是否进行连接测试 40.        jedisPoolConfig.setTestOnBorrow(true); 41. 42.        jedisPool = new JedisPool(jedisPoolConfig, host, Integer.parseInt(port)); 43. 44.        logger.info("JedisPool 已初始化, ", JSON.toJSONString(jedisPool)); 45.      } catch (Exception e) { 46.        logger.error("JedisPool 初始化异常", e); 47.      } 48.    } 49.  } 50. 51.  public static Jedis getJedis() { 52.    Jedis jedis = null; 53.    try { 54.      logger.info("jedisPool = ", jedisPool.toString()); 55.      jedis = jedisPool.getResource(); 56.      return jedis; 57.    } catch (Exception e) { 58.      logger.error("获取Jedis实例异常", e); 59.      jedisPool.returnBrokenResource(jedis); 60.      return null; 61.    } 62.  } 63. 64.  /** 65.   * 将jedis对象释放回连接池中 66.   * 67.   * @param jedis 使用完毕的Jedis对象 68.   * @return true 释放成功;否则返回false 69.   */ 70.  public static boolean release(Jedis jedis) { 71.    if (jedis != null) { 72.      jedisPool.returnResource(jedis); 73.      return true; 74.    } 75. 76.    return false; 77.  } 78.} 

获取【下载地址】 【新技术】现在最流行的java后台框架组合java springmvc mybaits mysql oracle html5 后台框架源码