1. 程式人生 > >springboot通過ApplicationContextAware獲取bean

springboot通過ApplicationContextAware獲取bean

 一個類實現了這個介面(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");
    }
}

還需要注入容器