Spring Boot————靜態方法如何呼叫Spring容器中的Bean
阿新 • • 發佈:2019-01-05
問題分析
在使用靜態方法的時候,某些情況下,需要使用類似自動注入的Bean來實現某些業務邏輯。
一般的非靜態方法,可以很容易的通過在方法所在的類中@Autowired自動將依賴的Bean注入到本類中,並操作。
靜態方法在使用同樣的操作流程時,由於靜態呼叫的約束,需要在@Autowired注入時,將Bean物件設定為是static。然而在呼叫時卻發生“空指標”異常。程式碼如下:
Service類:
呼叫類:
為什麼會出現這種情況?原因是Spring容器的依賴注入是依賴set方法,而set方法是例項物件的方法,而靜態變數屬於類,因此注入依賴時無法注入靜態成員變數,在呼叫的時候依賴的Bean才會為null。
解決方案
spring容器注入靜態變數的方法並不唯一,但是springboot對spring容器有一定的託管處理,很多配置屬於預設最優配置,因此,在springboot中,此問題最簡單的解決方案就是通過getBean的方式。
總體思路是:在springboot的啟動類中,定義static變數ApplicationContext,利用容器的getBean方法獲得依賴物件。
package com.mht; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @EnableJpaRepositories public class Start { private static Logger logger = LoggerFactory.getLogger(Start.class); public static ConfigurableApplicationContext ac; public static void main(String[] args) { Start.ac = SpringApplication.run(Start.class, args); logger.info("-----------------------啟動完畢-------------------------"); } }
修改呼叫方式:
package com.mht.utils;
import com.mht.Start;
import com.mht.service.SimpleService;
public class Utility {
public static void callService() {
Start.ac.getBean(SimpleService.class).testSimpleBeanFactory();
}
}
測試: