Spring boot 手動注入bean
阿新 • • 發佈:2018-12-31
Spring專案中,我們可能用到多執行緒,但是新建立的執行緒中,是不能自動注入bean/service的。這就需要我們手動去注入bean
網上說的方法大概有兩三種,我這隻列舉一種我驗證通過的。
本文專案框架Spring Boot --JHipster
1.首先需要寫一個手動獲取bean的工具類,原理,在專案啟動時獲取到spring上下文,從上下文中獲取到bean。
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.ComponentScan; import org.springframework.stereotype.Component; /** * 直接通過Spring 上下文獲取SpringBean,用於多執行緒環境 * by lida @20170629 */ @Component public class SpringContextUtil implements ApplicationContextAware { // Spring應用上下文環境 private static ApplicationContext applicationContext; /** * 實現ApplicationContextAware介面的回撥方法,設定上下文環境 */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 獲取物件 這裡重寫了bean方法,起主要作用 * example: getBean("userService")//注意: 類名首字母一定要小寫! */ public static Object getBean(String beanId) throws BeansException { return applicationContext.getBean(beanId); } }
2.線上程類中手動獲取bean/service
import com.hi.base.service.CalendarService; public class SdReleaseReview implements Runnable { private CalendarService calendarService; public SdReleaseReview() { this.calendarService=(CalendarService)SpringContextUtil.getBean("calendarService"); } @Override public void run(){ try { ... FactoryCalendar factoryCalendar = calendarService.getByExistDate("2000", today); ... }catch (Exception e){ ... } } }