`
geeksun
  • 浏览: 966540 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 初始化2次的问题

 
阅读更多

在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 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

    Spring Bean创建初始化流程.docx

    在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...

    spring初始化过程

    beanFactory.preInstantiateSingletons()的初始化过程详解,包含了所有的调用过程。

    SpringBoot项目启动时实现调用一次初始化方法.docx

    Spring初始化参数的顺序是: 1. 对象初始化——构造方法 2. 对象初始化——`@PostConstruct`注解的方法 3. 对象初始化——实现了`InitializingBean`接口的`afterPropertiesSet`方法 4. 对象初始化——自定义的`init`...

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    下面将详细介绍如何通过不同方式定义Spring Bean的初始化和销毁回调方法。 **初始化回调方法** 1. **@PostConstruct注解** 这个Java标准注解用于标记一个方法,该方法将在对象完全构造后但在业务逻辑执行前被调用...

    Spring的IoC容器初始化源码解析

    ### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...

    初始化后可访问Spring管理的Bean

    初始化后可访问Spring管理的Bean

    Spring Bean的初始化和销毁实例详解

    Spring Bean的初始化和销毁实例详解 Spring Bean的初始化和销毁是Spring框架中一个非常重要的概念,它们都是Bean生命周期中不可或缺的一部分。在Spring框架中,我们可以使用多种方式来控制Bean的初始化和销毁,以下...

    spring配置实例化后执行的初始化方法比对

    spring配置对象实例化后执行的方法,两种实现比对,通过InitializingBean接口,并实现arterPropertiesSet()方法;或者通过applicationContext.xml配置init-method属性

    浅谈spring容器中bean的初始化

    当`lazy-init`设置为`true`时,Spring容器不会在启动时立即创建Bean,而是在第一次请求该Bean时才进行初始化。这可以有效地延迟初始化,提高应用启动速度。例如,配置为`...

    Spring MVC启动时初始化的几个常用方法

    在Spring MVC框架中,应用程序启动时会执行一系列初始化操作,这些操作对于理解Spring MVC的工作原理至关重要。本篇文章将深入探讨Spring MVC启动时初始化的几个常用方法,并解释它们在实际开发中的作用。 首先,...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂方法的误用、AOP代理的配置问题或是Bean作用域设置不准确导致的。通过仔细检查和修正这些问题,可以避免...

    Spring初始化和销毁的实现方法

    "Spring初始化和销毁的实现方法" Spring框架中,Bean的初始化和销毁是非常重要的两个生命周期过程。今天我们将讨论Spring中 Bean 的初始化和销毁的实现方法。 1. 通过@Bean指定init-method和destroy-method 在 ...

    Spring中初始化泛型类的方法实例

    那么Spring初始化的`Processor&lt;T&gt;`将会是`Processor&lt;String&gt;`: ```java Processor&lt;String&gt; processor = new Processor(); processor.service = new StringService(); ``` 如果`Service&lt;T&gt;`是`NumberService...

    Spring 源码分析(Bean的初始化)

    2. **初始化回调**:如果Bean定义中指定了初始化方法,Spring会在Bean实例化后调用这个方法。 3. **AOP代理**:如果Bean配置了AOP代理,Spring会创建一个代理对象来包装原始的Bean实例,以便在方法调用时执行拦截器...

    Spring源码学习六:bean初始化1

    在Spring框架中,Bean的初始化是其生命周期中的关键步骤,特别是在单例模式下,Spring容器会确保在应用程序启动时创建并初始化所有非延迟加载的单例Bean。在本篇文章中,我们将深入探讨Spring源码中关于Bean初始化的...

    kotlin spring boot 初始化脚手架

    在本文中,我们将深入探讨如何使用Kotlin与Spring Boot构建一个初始化脚手架,并结合Mybatis Plus进行数据库操作的优化,以实现高效的应用快速开发。 首先,Kotlin是一种静态类型的编程语言,它提供了现代编程语言...

    初始化的单体流程引擎 camunda

    本篇文章将详细探讨如何在Spring Boot框架中集成并初始化Camunda流程引擎。 **Spring Boot集成Camunda** Spring Boot以其“开箱即用”的特性,简化了Java应用的开发过程。集成Camunda到Spring Boot项目中,可以...

    springBean加载过程源码解析文档,附有代码类名和行数

    Spring Bean 加载过程是 Spring 框架中最核心的部分之一,涉及到 ApplicationContext 的初始化、Bean 的加载和注册等过程。在 Spring Boot 应用程序中,SpringApplication 负责加载和管理 Bean。 SpringApplication...

Global site tag (gtag.js) - Google Analytics