詳解SpringBoot靜態(tài)方法獲取bean的三種方式
方式一 注解@PostConstruct
import com.example.javautilsproject.service.AutoMethodDemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; /** * springboot靜態(tài)方法獲取 bean 的三種方式(一) * @author: clx * @date: 2019/7/23 * @version: 1.1.0 */ @Component public class StaticMethodGetBean_1 { @Autowired private AutoMethodDemoService autoMethodDemoService; @Autowired private static AutoMethodDemoService staticAutoMethodDemoService; @PostConstruct public void init() { staticAutoMethodDemoService = autoMethodDemoService; } public static String getAuthorizer() { return staticAutoMethodDemoService.test(); } }
注解@PostConstruct說明
PostConstruct 注釋用于在依賴關系注入完成之后需要執(zhí)行的方法上,以執(zhí)行任何初始化。此方法必須在將類放入服務之前調(diào)用。支持依賴關系注入的所有類都必須支持此注釋。即使類沒有請求注入任何資源,用 PostConstruct 注釋的方法也必須被調(diào)用。只有一個方法可以用此注釋進行注釋。
應用 PostConstruct 注釋的方法必須遵守以下所有標準:
- 該方法不得有任何參數(shù),除非是在 EJB 攔截器 (interceptor) 的情況下,根據(jù) EJB 規(guī)范的定義,在這種情況下它將帶有一個 InvocationContext 對象 ;
- 該方法的返回類型必須為 void;
- 該方法不得拋出已檢查異常;
- 應用 PostConstruct 的方法可以是 public、protected、package private 或 private;
- 除了應用程序客戶端之外,該方法不能是 static;
- 該方法可以是 final;
- 如果該方法拋出未檢查異常,那么不得將類放入服務中,除非是能夠處理異常并可從中恢復的 EJB。
方式二 啟動類ApplicationContext
實現(xiàn)方式:在springboot的啟動類中,定義static變量ApplicationContext,利用容器的getBean方法獲得依賴對象
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** * @author: clx * @date: 2019/7/23 * @version: 1.1.0 */ @SpringBootApplication public class Application { public static ConfigurableApplicationContext ac; public static void main(String[] args) { ac = SpringApplication.run(Application.class, args); } }
調(diào)用方式
/** * @author: clx * @date: 2019/7/23 * @version: 1.1.0 */ @RestController public class TestController { /** * 方式二 */ @GetMapping("test2") public void method_2() { AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class); String test2 = methodDemoService.test2(); System.out.println(test2); } }
方式三 手動注入ApplicationContext
手動注入ApplicationContext
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * springboot靜態(tài)方法獲取 bean 的三種方式(三) * @author: clx * @date: 2019/7/23 * @version: 1.1.0 */ @Component public class StaticMethodGetBean_3<T> implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { StaticMethodGetBean_3.applicationContext = applicationContext; } public static <T> T getBean(Class<T> clazz) { return applicationContext != null?applicationContext.getBean(clazz):null; } }
調(diào)用方式
/** * 方式三 */ @Test public void method_3() { AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class); String test3 = autoMethodDemoService.test3(); System.out.println(test3); }
以上三種方式樓主都測試過可以為完美使用
到此這篇關于詳解SpringBoot靜態(tài)方法獲取bean的三種方式的文章就介紹到這了,更多相關SpringBoot靜態(tài)方法獲取bean內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot配置主從數(shù)據(jù)庫實現(xiàn)讀寫分離
現(xiàn)在的 Web 應用大都是讀多寫少,本文主要介紹了SpringBoot配置主從數(shù)據(jù)庫實現(xiàn)讀寫分離,具有一定的參考價值,感興趣的可以了解一下2023-11-11