SpringBoot靜態獲取 bean的三種方式
阿新 • • 發佈:2021-10-28
注意:呼叫者要被spring管理
目錄
- 方式一 註解@PostConstruct
- 方式二 啟動類ApplicationContext
- 方式三 手動注入ApplicationContext
方式一 註解@PostConstruct
import com.example.javautilsproject.service.AutoMethodDemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; importjavax.annotation.PostConstruct; /** * springboot靜態方法獲取 bean 的三種方式(一) * @author: clx * @version: 1.1.0 */ @Component public class StaticMethodGetBean_1 { @Autowired private AutoMethodDemoService autoMethodDemoService; @Autowired private static AutoMethodDemoService staticAutoMethodDemoService; @PostConstructpublic void init() { staticAutoMethodDemoService = autoMethodDemoService; } public static String getAuthorizer() { return staticAutoMethodDemoService.test(); } }
註解@PostConstruct說明
PostConstruct 註釋用於在依賴關係注入完成之後需要執行的方法上,以執行任何初始化。
此方法必須在將類放入服務之前呼叫。支援依賴關係注入的所有類都必須支援此註釋。
即使類沒有請求注入任何資源,用 PostConstruct 註釋的方法也必須被呼叫。
只有一個方法可以用此註釋進行註釋。
應用 PostConstruct 註釋的方法必須遵守以下所有標準:
- 該方法不得有任何引數,除非是在 EJB 攔截器 (interceptor) 的情況下,根據 EJB 規範的定義,在這種情況下它將帶有一個 InvocationContext 物件 ;
- 該方法的返回型別必須為 void;
- 該方法不得丟擲已檢查異常;
- 應用 PostConstruct 的方法可以是 public、protected、package private 或 private;
- 除了應用程式客戶端之外,該方法不能是 static;
- 該方法可以是 final;
- 如果該方法丟擲未檢查異常,那麼不得將類放入服務中,除非是能夠處理異常並可從中恢復的 EJB。
方式二 啟動類ApplicationContext
實現方式:在springboot的啟動類中,定義static變數ApplicationContext,利用容器的getBean方法獲得依賴物件
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** * @author: clx * @version: 1.1.0 */ @SpringBootApplication public class Application { public static ConfigurableApplicationContext ac; public static void main(String[] args) { ac = SpringApplication.run(Application.class, args); } }
呼叫方式
/** * @author: clx * @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靜態方法獲取 bean 的三種方式(三) * @author: clx * @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; } }
呼叫方式
/** * 方式三 */ @Test public void method_3() { AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class); String test3 = autoMethodDemoService.test3(); System.out.println(test3); }
以上三種方式樓主都測試過可以為完美使用。
https://mp.weixin.qq.com/s/KgQUVAbyiTTHFM7hxH7BUg