SpringBoot五种获取ApplicationContext的实现方式

 更新时间:2025年09月19日 09:27:58   作者:enjoy编程  
本文系统梳理了获取Spring ApplicationContext的多种方式,包括创建工具类、实现ApplicationContextInitializer接口、ApplicationListener接口、启动类配置、ApplicationContextAware接口及@Resource注解注入,提供便捷的bean获取与容器操作方案

之前每次想要获取Spring上下文【ApplicationContext】的时候,都去现查方案。

本文针对获取Spring ApplicationContext的方式做了梳理,总结。

1. 概念

ApplicationContext是什么?

简单来说就是Spring中的容器,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能

2. 获取ApplicationContext的方式

2.1 创建工具类

通过此工具类,可以方便的获取bean组件, 获取配置信息等

import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;

public class SpringUtil {
    private static ApplicationContext applicationContext = null;
    private static Environment environment = null;

    public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
            environment = applicationContext.getEnvironment();
            //TODO 设置后,可以做一些操作
        }
    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Environment getEnvironment() {
        return environment;
    }

    //通过name获取 Bean.
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);

    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }

    public static String getString(String key) {
        return environment.getProperty(key);
    }

    public static int getInt(String key) {
        return NumberUtils.toInt(environment.getProperty(key));
    }

    public static long getLong(String key) {
        return NumberUtils.toLong(environment.getProperty(key));
    }

    public static boolean getBoolean(String key) {
        return BooleanUtils.toBoolean(environment.getProperty(key));
    }
}

方式1. 实现ApplicationContextInitializer接口

实现接口后,将此类注入到Spring容器中,有两种方式。当然也可以直接调用静态方法

  • 第一种: 在此类上加`@Component`注解
  • 第二种:在 `resources/META-INF/spring.factories`文件中添加以下配置:  org.springframework.context.ApplicationContextInitializer=CustomerApplicationContextInitializer的路径

实现ApplicationContextInitializer的源码示例:

public class CustomApplicationContextInitializer implements ApplicationContextInitializer {
  @Override
  public void initialize(ConfigurableApplicationContext applicationContext) {    
     SpringBeanUtils.setApplicationContext(applicationContext);
  }
}

方式2. 实现ApplicationListener接口

实现接口后,将此类注入到Spring容器中,有两种方式。当然也可以直接调用静态方法

  • 第一种: 在此类上加`@Component`注解
  • 第二种:在 `resources/META-INF/spring.factories`文件中添加以下配置:  org.springframework.context.ApplicationContextInitializer=CustomerApplicationListener的路径

实现ApplicationListener的源码示例:

public class CustomApplicationListener implements ApplicationListener<ApplicationContextEvent> {
  @Override
  public void onApplicationEvent(ApplicationContextEvent event) {        
     SpringBeanUtils.setApplicationContext(event.getApplicationContext());
  }
}

方式3. 在启动类main方法中设置

@SpringBootApplication
@EnableSwagger2
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(WangMikeSpringApplication.class, args);        
        SpringBeanUtils.setApplicationContext(applicationContext);
    }
}

方式4. 实现ApplicationContextAware接口

@Component
public class SpringBeanUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    public  void setApplicationContext(ApplicationContext applicationContext){
        SpringBeanUtils.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext(
        return applicationContext;
    }
}

方式5. 直接通过@Resource注解注入

@Component
@Order(value = 1)
@Slf4j
public class AppStartRunner implements org.springframework.boot.ApplicationRunner {
    protected static Logger logger = LoggerFactory.getLogger(AppStartRunner.class);

    @Resource
    ApplicationContext applicationContext;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java对比两个实体的差异分析

    Java对比两个实体的差异分析

    这篇文章主要介绍了Java对比两个实体的差异分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    这篇文章主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • java实现投票程序设计

    java实现投票程序设计

    这篇文章主要介绍了java实现投票程序设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 关于HashMap的put方法执行全过程

    关于HashMap的put方法执行全过程

    这篇文章主要介绍了关于HashMap的put方法执行全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • JAVA基础之控制台输入输出的实例代码

    JAVA基础之控制台输入输出的实例代码

    下面小编就为大家带来一篇JAVA基础之控制台输入输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 详解Java枚举类在生产环境中的使用方式

    详解Java枚举类在生产环境中的使用方式

    本文主要介绍了Java枚举类在生产环境中的使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • Java同时处理多个数据的常见方法

    Java同时处理多个数据的常见方法

    在Java中,同时处理多个数据通常涉及多线程、并发编程或异步编程,这里我将提供一个使用多线程的示例,因为多线程是处理多个数据并行的常见方式,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-11-11
  • Java的Spring框架中AOP项目的一般配置和部署教程

    Java的Spring框架中AOP项目的一般配置和部署教程

    这篇文章主要介绍了Java的Spring框架中AOP项目的一般配置和部署教程,AOP面向方面编程的项目部署结构都比较类似,因而也被看作是Spring的一种设计模式使用,需要的朋友可以参考下
    2016-04-04
  • java 基础之JavaBean属性命名规范问题

    java 基础之JavaBean属性命名规范问题

    这篇文章主要介绍了java 基础之JavaBean属性命名规范问题的相关资料,需要的朋友可以参考下
    2017-05-05
  • 关于LinkedList集合对元素进行增查删操作

    关于LinkedList集合对元素进行增查删操作

    LinkedList集合内部包含有两个Node类型的first和last属性维护一个双向循环链表,在链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来,需要的朋友可以参考下
    2023-04-04

最新评论