解决:springboot在启动类main方法中调用service层方法报“空指针异常“

大多数情况下,我们使用Springboot是创建一个maven项目,然后通过controller层的接口调用。但也有特殊情况,比如将需要传参的接口直接打包成可执行jar包运行,这个时候,就需要在启动类main方法中注入Bean,调用Service层方法使用。

按照常规service方法调用实现,报错如下:

报错原因:是service注入为空,service无法导入到非controller层中去

解决方法:注入bean

1、首先建立一个Spring工具类:SpringUtil

java 复制代码
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringUtil.applicationContext == null){
            SpringUtil.applicationContext  = applicationContext;
        }
    }


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

    //通过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);
    }
}

ApplicationContextAware :

当一个类实现ApplicationContextAware接口后,这个类就可以方便获得ApplicationContext中所有的bean。简言之,就是这个类可以直接获取spring配置文件中所有有引用到的bean对象。

ApplicationContext:

ApplicationContext是由BeanFactory派生而来的,BeanFactory负责配置、创建、管理Bean,是Spring容器最基本的接口;

BeanFactory的许多功能需要变成实现,而ApplicationContext中则可以通过配置的方式实现,即:

在构建容器的时候,ApplicationContext创建对象采用的策略是立即加载的方式,即只要一读取完配置文件就立即创建配置文件中配置的对象。BeanFactory采用的是延迟加载的方式,什么时候根据id获取对象了,什么时候才真正地创建对象。

2、在main方法中调用service,注意要启动入口类 SpringApplication.run(TextCutApplication.class, args);

加载Spring配置文件时,如果Spring配置文件中所定义的类实现了ApplicationContextAware接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware接口中的setApplicationContext 方法,获得ApplicationContext对象。

ApplicationContext对象是由Spring注入的,前提必须在Spring配置文件中指定该类。

相关推荐
云原生指北37 分钟前
Omnipub E2E 测试文章 - 自动化验证
后端
IT_陈寒1 小时前
SpringBoot自动配置揭秘:5个让开发效率翻倍的隐藏技巧
前端·人工智能·后端
添尹1 小时前
Go语言基础之数组
后端·golang
luom01023 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
黄俊懿3 小时前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
希望永不加班3 小时前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring
散峰而望3 小时前
【基础算法】从入门到实战:递归型枚举与回溯剪枝,暴力搜索的初级优化指南
数据结构·c++·后端·算法·机器学习·github·剪枝
前端付豪4 小时前
Memory V1:让 AI 记住你的关键信息
前端·后端·llm
编码忘我4 小时前
RokcetMq的顺序消费、防丢失、去重
后端
毕设源码-朱学姐4 小时前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端