SpringBoot 五种获取ApplicationContext的方式

之前每次想要获取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;

 

 

### 回答1: Spring Boot加载应用程序上下文失败。 这可能是由于以下原因之一导致的: 1. 应用程序配置错误:检查应用程序配置文件是否正确,例如application.properties或application.yml文件。 2. 依赖项冲突:检查应用程序的依赖项是否存在冲突,可能需要升级或降级某些依赖项。 3. 缺少必需的依赖项:检查应用程序是否缺少必需的依赖项,例如数据库驱动程序或Spring Boot Starter。 4. 代码错误:检查应用程序代码是否存在错误,例如无法找到或加载类。 您可以查看应用程序的日志文件以获取更多详细信息,以确定导致加载应用程序上下文失败的确切原因。 ### 回答2: 在解决SpringBoot应用程序加载ApplicationContext失败的问题时,需要从以下几个方面进行分析: 1.检查pom文件中的依赖项 通常,SpringBoot应用程序依赖于许多其他库和框架,如果依赖项存在问题,则可能导致ApplicationContext加载失败。尝试检查依赖是否正确,版本是否与当前SpringBoot版本兼容。 2.检查配置文件 SpringBoot应用程序需要一个或多个配置文件。如果这些文件中存在任何错误,可能会导致ApplicationContext加载失败。尝试检查配置文件,确保文件格式正确,属性名称正确,属性值有效和正确地指定配置文件位置。 3.检查注解 SpringBoot使用注解来完成各种任务。如果注解用得不正确或没有正确使用注解可能会导致ApplicationContext加载失败。尝试检查注解,确保正确使用了@Service、@Component等注解。 4.检查应用程序代码 在应用程序中编写不正确的代码可能会导致ApplicationContext加载失败。检查代码,找出是否有任何语法错误或逻辑错误。 5.检查日志文件 日志文件可以提供有关ApplicationContext加载失败的更多信息。尝试检查日志文件以查找有关加载失败的详细信息。 在解决ApplicationContext加载失败的问题时,需要进行深入的分析和排查。通过综合上述几个方面进行分析,可以帮助我们找到问题的根源并解决这一问题。 ### 回答3: 当我们在使用SpringBoot进行开发时,可能会遇到“failed to load applicationcontext”这样的错误信息。这个错误信息通常出现在应用程序上下文加载的时候,比如说,当我们在启动SpringBoot应用时,它会自动扫描类路径下的所有组件并将它们加载到应用程序上下文中,但是在加载的过程中,可能会出现一些问题而导致上下文加载失败。 以下是一些常见的出现“failed to load applicationcontext”错误的原因: 1. 依赖冲突。如果你在应用程序中使用了一些不兼容的依赖库,或者使用了多个版本的同一个库,就有可能会导致应用程序上下文加载失败。 2. 配置错误。如果你在应用程序的配置文件中有一些错误或者不一致的配置,就有可能会导致应用程序上下文加载失败。 3. 缺少必要的依赖项。如果你在应用程序中引用了一个不包含所需依赖项的库,就会导致应用程序上下文加载失败。 解决此问题的方法是: 1. 排查依赖库的错误:我们可以使用一些工具,比如 Maven Dependency Plugin,来排查依赖库的问题。你可以使用该插件查找依赖树中的不兼容版本的库,以便找到并解决问题。 2. 检查配置文件:如果你的应用程序的配置文件(比如application.properties或application.yml)出现了问题,就会导致应用程序上下文加载失败。因此,我们可以检查配置文件,找出错误并纠正。 3. 确保所有依赖项都存在:当我们引用某个库时,一定要确保它包含了所有所需的依赖项。如果有任何缺失,就会导致应用程序上下文加载失败。 总之,当我们遇到“failed to load applicationcontext”的错误时,最好先去检查以上三个方面的问题,以确定问题的来源,并解决它们,以便确保应用程序正常运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

enjoy编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值