spring通過enableredishttpsession注解來啟用redid session
該注解有兩個元注解,一個是configuration, 一個是import, 上一篇提過configuration,它就相當于是beans配置,而import則相當于是beans裡嵌套了另一個beans配置項。另外再介紹一下bean這個注解,這個注解相當于是beans配置裡的bean标簽,它是注解在方法上的,被注解方法的傳回值就是一個spring bean,而相應的方法名就是作為bean name,如果顯示的設定了name屬性,那就以name屬性值作為bean name。
是以可以了解為enableredishttpsession就是一個程式設計式的配置定義,而redishttpsessionconfiguration顯然也應該是一個程式設計式配置定義。
在redishttpsessionconfiguration裡很驚喜的發現了第一篇裡被注入的“springsessionrepositoryfilter”。
這裡相當于是定義了一個bean-name=”springsessionrepositoryfilter” class=”org.springframework.session.web.http.sessionrepositoryfilter”的bean。
兩個參數sessionrepository和servletcontext都是由spring容器管理的依賴,sessionrepository和springsessionrepositoryfilter定義在同一個configuration裡。servletcontext的注入可能會比較令人疑惑,在這個configuration沒有定義它無法定義它,因為它是由servlet容器生成的。
在介紹servletcontext的依賴之前,再聊下前文提過的contextloaderlistener。它由initializer動态注冊,其構造函數參數為一個webapplicationcontext,繼承于contextloader(實際啟動webapplicationcontext初始化工作的對象),構造函數參數是一個webapplicationcontext。
servlet容器啟動時會通知contextloaderlistener,
contextloaderlistener會調用父類contextloader的initwebapplicationcontext方法來啟動applicationcontext的初始化,
上面隻抽取了contextloader的關鍵邏輯
1. applicationcontext被預設放入了servletcontext中,key是個預設值。上一篇提過在擷取對應name的filter時會從servletcontext裡先得applicationcontext,再擷取對應依賴。
2. configureandrefreshwebapplicationcontext這個方法最終啟動了applictioncontext的最核心refresh,這個方法被放在公共抽象類abstractapplicationcontext裡,幾乎所有的applicationcontext都會執行。這個階段結束後,applicationcontext也就啟動完畢,整個容器的依賴也就完成。因為篇幅太長applicationcontext啟動的細節就不再展開。
在容器refresh階段會通過postprocessbeanfactory這個政策方法對容器對應的beanfactory做後處理,一般是設定一些beanpostprocessor之類,對于webapplicationcontext則會處理servletcontext的依賴。
至此,springsessionrepositoryfilter的依賴也注入完畢。綜合1,2兩篇基本上就了解了filter是如何被spring容器管理并如何通過代理動态注冊給容器的。那麼這個攔截器究竟能做什麼?這就留到後面專門通過一篇文章來展開
<a href="http://blog.csdn.net/szwandcj/article/details/50225979">《spring-session源碼解讀1》</a>