1. 程式人生 > >Spring Boot————靜態方法如何呼叫Spring容器中的Bean

Spring Boot————靜態方法如何呼叫Spring容器中的Bean

問題分析

在使用靜態方法的時候,某些情況下,需要使用類似自動注入的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();
    }
}

測試: