Spring启动时,将SpringContext设置到Util中(SpringContextUtil)

场景

在Spring应用开发中,为简化代码或者在静态方法中获取Spring应用的上下文,需要把SpringContext设置到类属性上。经过对源码的分析和实践,使用Spring的事件监听器监听ApplicationPreparedEvent事件是最佳的方式。

通过ApplicationPreparedEvent类的注释可知,该事件是在ApplicationContext创建完成后(未刷新前)发布的,也就是说我们收到该事件通知的时间比任何业务Bean初始化的时间都早。
在这里插入图片描述

实现

创建SpringContextUtil

@UtilityClass
public class SpringContextUtil {

    private static Boolean isDev;
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        if (applicationContext == null) {
            throw new RuntimeException("应用上下文未初始化完成");
        }
        return applicationContext;
    }

    /**
     * 是否是开发模式
     *
     * @return 是否开发模式
     */
    public static boolean isDev() {
        if (isDev == null) {
            Environment environment = getApplicationContext().getEnvironment();
            String[] activeProfiles = environment.getActiveProfiles();
            for (String activeProfile : activeProfiles) {
                if (JudgerConst.PROFILE_DEV.equalsIgnoreCase(activeProfile.trim())) {
                    isDev = Boolean.TRUE;
                    break;
                }
            }
            if (isDev == null) {
                isDev = Boolean.FALSE;
            }
        }
        return isDev;
    }

    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

    public static <T> T getTryBean(Class<T> clazz) {
        try {
            return getBean(clazz);
        } catch (Exception ignored) {
        }
        return null;
    }

    public static void initApplicationContext(ApplicationContext applicationContext) {
        if (applicationContext != null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }
}

创建AppContextInitListener

@Slf4j
public class AppContextInitListener implements ApplicationListener<ApplicationPreparedEvent> {
    @Override
    public void onApplicationEvent(ApplicationPreparedEvent event) {
        log.info("Load app context");
        SpringUtil.initApplicationContext(event.getApplicationContext());
    }
}

注册监听器

# META-INF/spring.factories
org.springframework.context.ApplicationListener=\
  cn.cpoet.judger.support.AppContextInitListener

原文地址:https://www.cpoet.cn/post/framework/spring/spring-context-util/

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值