注意:調用者要被spring管理
目錄
- 方式一 注解@PostConstruct
- 方式二 啟動類ApplicationContext
- 方式三 手動注入ApplicationContext
方式一 注解@PostConstruct
import com.example.javautilsproject.service.AutoMethodDemoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; /** * springboot靜態方法獲取 bean 的三種方式(一) * @author: clx * @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 注釋用於在依賴關系注入完成之后需要執行的方法上,以執行任何初始化。
此方法必須在將類放入服務之前調用。支持依賴關系注入的所有類都必須支持此注釋。
即使類沒有請求注入任何資源,用 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