一、為什么需要ApplicationContextAware?
在某些類中我們經常需要通過ApplicationContext來獲取需要的bean,但每一次使用new ClassPathXmlApplicationContext()都會重新裝配文件並實例化上下文bean,這樣肯定是很麻煩的,此時ApplicationContextAware接口的作用就體現出來了——spring會給實現此接口的類注入ApplicationContext對象
二、如何使用?
通常我們是寫一個ApplicationContextUtil工具類
public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext context; public void setApplicationContext(ApplicationContext context) throws BeansException { this.context = context; } public static ApplicationContext getContext() { return context; } }
三、spring何時注入上下文?
通過源碼跟蹤了解到AbstractApplicationContext.class下的refresh()方法中的prepareBeanFactory這句跟Aware有關,我們還可以看到:ApplicationContextAware是在spring初始化完bean后才注入上下文的
prepareBeanFactory方法中涉及到上圖紅圈圈這個類,此類中的方法postProcessBeforeInitialization調用了此類中的invokeAwareInterfaces方法:
看到沒,上圖畫圈圈的地方就是spring對實現ApplicationContextAware接口的類調用setApplicationContext進行上下文注入