springboot通過ApplicationContextAware獲取bean
阿新 • • 發佈:2018-11-21
一個類實現了這個介面(ApplicationContextAware
)之後,這個類就可以方便獲得 ApplicationContext
中的所有 bean。換句話說,就是這個類可以直接獲取 Spring 配置檔案中,所有有引用到的 Bean 物件
@Component public class SpringContext implements ApplicationContextAware, DisposableBean { private static final Logger logger = LoggerFactory.getLogger(SpringContext.class); private static ApplicationContext applicationContext; /** * 獲取儲存在靜態變數中的 ApplicationContext * @return */ public static ApplicationContext getApplicationContext() { assertContextInjected(); return applicationContext; } /** * 從靜態變數 applicationContext 中獲取 Bean,自動轉型成所賦值物件的型別 * @param name * @param <T> * @return */ public static <T> T getBean(String name) { assertContextInjected(); return (T) applicationContext.getBean(name); } /** * 從靜態變數 applicationContext 中獲取 Bean,自動轉型成所賦值物件的型別 * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { assertContextInjected(); return applicationContext.getBean(clazz); } /** * 實現 DisposableBean 介面,在 Context 關閉時清理靜態變數 * @throws Exception */ public void destroy() throws Exception { logger.debug("清除 SpringContext 中的 ApplicationContext: {}", applicationContext); applicationContext = null; } /** * 實現 ApplicationContextAware 介面,注入 Context 到靜態變數中 * @param applicationContext * @throws BeansException */ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContext.applicationContext = applicationContext; } /** * 斷言 Context 已經注入 */ private static void assertContextInjected() { Validate.validState(applicationContext != null, "applicationContext 屬性未注入,請在 spring-context.xml 配置中定義 SpringContext"); } }
還需要注入容器