SpringBoot在啟動(dòng)類main方法中調(diào)用service層方法報(bào)“空指針異?!暗慕鉀Q辦法
大多數(shù)情況下,我們使用Springboot是創(chuàng)建一個(gè)maven項(xiàng)目,然后通過(guò)controller層的接口調(diào)用。但也有特殊情況,比如將需要傳參的接口直接打包成可執(zhí)行jar包運(yùn)行,這個(gè)時(shí)候,就需要在啟動(dòng)類main方法中注入Bean,調(diào)用Service層方法使用。
按照常規(guī)service方法調(diào)用實(shí)現(xiàn),報(bào)錯(cuò)如下:

報(bào)錯(cuò)原因:是service注入為空,service無(wú)法導(dǎo)入到非controller層中去
解決方法:注入bean
1、首先建立一個(gè)Spring工具類:SpringUtil
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;
}
//通過(guò)name獲取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通過(guò)class獲取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通過(guò)name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
ApplicationContextAware :當(dāng)一個(gè)類實(shí)現(xiàn)ApplicationContextAware接口后,這個(gè)類就可以方便獲得ApplicationContext中所有的bean。簡(jiǎn)言之,就是這個(gè)類可以直接獲取spring配置文件中所有有引用到的bean對(duì)象。
ApplicationContext:ApplicationContext是由BeanFactory派生而來(lái)的,BeanFactory負(fù)責(zé)配置、創(chuàng)建、管理Bean,是Spring容器最基本的接口;
BeanFactory的許多功能需要變成實(shí)現(xiàn),而ApplicationContext中則可以通過(guò)配置的方式實(shí)現(xiàn),即:
在構(gòu)建容器的時(shí)候,ApplicationContext創(chuàng)建對(duì)象采用的策略是立即加載的方式,即只要一讀取完配置文件就立即創(chuàng)建配置文件中配置的對(duì)象。BeanFactory采用的是延遲加載的方式,什么時(shí)候根據(jù)id獲取對(duì)象了,什么時(shí)候才真正地創(chuàng)建對(duì)象。
2、在main方法中調(diào)用service,注意要啟動(dòng)入口類 SpringApplication.run(TextCutApplication.class, args);
加載Spring配置文件時(shí),如果Spring配置文件中所定義的類實(shí)現(xiàn)了ApplicationContextAware接口,那么在加載Spring配置文件時(shí),會(huì)自動(dòng)調(diào)用ApplicationContextAware接口中的setApplicationContext方法,獲得ApplicationContext對(duì)象。
ApplicationContext對(duì)象是由Spring注入的,前提必須在Spring配置文件中指定該類。

到此這篇關(guān)于SpringBoot在啟動(dòng)類main方法中調(diào)用service層方法報(bào)“空指針異常“的解決辦法的文章就介紹到這了,更多相關(guān)SpringBoot service空指針異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)
相信大家都知道Java解析xml的方法有四種,每種方法都很不錯(cuò),今天通過(guò)本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過(guò)兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧2021-08-08
springboot模塊里面調(diào)用另外一個(gè)模塊的方法實(shí)現(xiàn)
在Spring-Boot項(xiàng)目開發(fā)中,存在著本模塊的代碼需要訪問(wèn)外面模塊接口,本文就來(lái)介紹一下springboot模塊里面調(diào)用另外一個(gè)模塊的方法實(shí)現(xiàn),感興趣的可以了解一下2023-11-11
淺談Java由于不當(dāng)?shù)膱?zhí)行順序?qū)е碌乃梨i
為了保證線程的安全,我們引入了加鎖機(jī)制,但是如果不加限制的使用加鎖,就有可能會(huì)導(dǎo)致順序死鎖(Lock-Ordering Deadlock)。本文將會(huì)討論一下順序死鎖的問(wèn)題。2021-06-06
java selenium使用瀏覽器調(diào)試工具實(shí)現(xiàn)方法
本文主要介紹java selenium使用瀏覽器調(diào)試工具,這里整理了幾種瀏覽器的調(diào)試方法,有需要的小伙伴可以參考下2016-08-08
IntelliJ IDEA查看項(xiàng)目git路徑的三種方式
這篇文章主要介紹了IntelliJ IDEA查看項(xiàng)目git路徑的三種方式,文中通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12
注意Java中?new?BigDecimal(double?val)?的使用
這篇文章主要介紹了注意Java中?new?BigDecimal(double?val)?的使用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
通過(guò)Java實(shí)現(xiàn)zip文件與rar文件解壓縮的詳細(xì)步驟
這篇文章主要給大家介紹了如何通過(guò)?Java?來(lái)完成?zip?文件與?rar?文件的解壓縮,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07
解決SpringBoot打成jar運(yùn)行后無(wú)法讀取resources里的文件問(wèn)題
這篇文章主要介紹了解決SpringBoot打成jar運(yùn)行后無(wú)法讀取resources里的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

