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 后台框架源码

时间: 2024-10-13 04:29:30

Spring 初始化2次的问题的相关文章

Spring初始化ApplicationContext为null

1. ApplicationContextAware初始化 通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法. 我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean. 使用方法如下: 1.实现ApplicationContextAware接口: package com.bis.majian.practice.module.sp

Spring初始化ApplicationContext线程托管实际运用架构构思

今天我分享一个技术点,利用Spring初始化+线程接管进行程序启动后保持会话状态. 先来一段@test单元测试注解,后台开发的很熟悉,这是测试局部代码用的: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") RunWith和ContextConfiguration的源码和功能就不细解释了,不熟悉的可以去翻翻源码. 1:

使用maven多模块来构建系统时,spring初始化报错的问题

最近在实验maven结构的maven工程时,碰到一个问题,springbean总是初始化失败: Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userMapper' defined in file [D:\workspace\mavenweb\mavenweb-webapp\src\main\webapp\WEB-INF

spring初始化bean的顺序

不是说单个bean的初始化顺序.这个顺序大体上是构造方法-set方法-init方法,详细的可以百度. 这里说的是在spring容器中互不相关的两个bean的初始化顺序.例如: <bean id="a" class="A"/> <bean id="b" class="B"/> 经过昨天遇到的问题,现在知道了这两个bean的顺序是以xml文件中的顺序为准的.例如a配置在b的前面,那么spring就先装配实例

spring 初始化Bean

说起spring bean的初始化自然而然就离不开初始化阶段的循环引用:1 首先spring容器在启动后会创建一个beanFactory,new DefaultListableBeanFactory. 2 然后在spring容器启动过程中会调用核心的refresh方法,在这个方法中共调用了9个方法,即为spring容器的初始过程,所以说spring容器不单单是我们狭义概念中的map那么简单,在这个方法中包含两个最最主要的方法: 2.1 invokeBeanFactoryPostProcessor

关于Spring初始化配置中的dispatcherServlet的配置问题

前几年的web开发中,url通常是以.do..action..xhtml等等作为结尾,所以在web.xml中通常配置DispatcherServlet的url-pattern类似.do..action结尾,这样的配置方式导致dispatcherServlet只会拦截*do或者*.action结尾,当然这样的方式不会带来任何问题,例如:  <servlet>         <servlet-name>Spring</servlet-name>         <s

当web中应用spring框架启动后,获得spring初始化的bean和ServletContext

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); wac.getBean(beanID); 还有,它还能获得web程序的servletContext. wac.getServletContext();

spring初始化相关

获取applicationContext implements ApplicationContextAware @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; }

ssh下:系统初始化实现ServletContextListener接口时,获取spring中数据层对象无效的问题

想要实现的功能:SSH环境下,数据层都交由Spring管理:在服务启动时,将数据库中的一些数据加载到ServletContext中缓存起来. 系统初始化类需要实现两个接口: ServletContextListener,系统初始化时调用contextInitialized方法缓存数据: ApplicationContextAware,获取Spring的ApplicationContext对象,以获取spring容器管理的service对象. 系统初始化类如下: 1 package com.liz