spring中幾個常用的介面
一.FactoryBean介面
BeanFactory: 以Factory結尾,表示它是一個工廠類,是用於管理Bean的一個工廠
FactoryBean: 以Bean結尾,表示它是一個Bean,不同於普通Bean的是:
它是實現了FactoryBean介面的Bean,根據該Bean的Id從BeanFactory中獲取的實際上是FactoryBean的getObject()返回的物件,
而不是FactoryBean本身, 如果要獲取FactoryBean物件,可以在id前面加一個&符號來獲取
package org.springframework.beans.factory; public interface FactoryBean<T> { T getObject() throws Exception; Class<?> getObjectType(); boolean isSingleton(); }
FactoryBean 通常是用來建立比較複雜的bean,一般的bean 直接用xml配置即可,但如果一個bean的建立過程中涉及到很多其他的bean 和複雜的邏輯,用xml配置比較困難,這時可以考慮用FactoryBean。
很多開源專案在整合Spring 時都使用到FactoryBean,比如 MyBatis3 提供 mybatis-spring專案中的 org.mybatis.spring.SqlSessionFactoryBean
二.BeanPostProcessor介面使用
BeanPostProcessor介面作用是:如果我們需要在Spring容器完成Bean的例項化、配置和其他的初始化前後新增一些自己的邏輯處理,我們就可以定義一個或者多個BeanPostProcessor介面的實現,然後註冊到容器中。
public interface BeanPostProcessor { /** * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. */ //例項化、依賴注入完畢,在呼叫顯示的初始化之前完成一些定製的初始化任務 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; /** * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method). The bean will already be populated with property values. */ //例項化、依賴注入、初始化完畢時執行 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
由方法名字也可以看出,前者在例項化及依賴注入完成後、在任何初始化程式碼(比如配置檔案中的init-method)呼叫之前呼叫;後者在初始化程式碼呼叫之後呼叫。
注意:
1、介面中的兩個方法都要將傳入的bean返回,而不能返回null,如果返回的是null那麼我們通過getBean方法將得不到目標。
2、BeanFactory和ApplicationContext對待bean後置處理器稍有不同。ApplicationContext會自動檢測在配置檔案中實現了BeanPostProcessor介面的所有bean, 並把它們註冊為後置處理器,然後在容器建立bean的適當時候呼叫它,因此部署一個後置處理器同部署其他的bean並沒有什麼區別。而使用BeanFactory實現的時候,bean 後置處理器必須通過程式碼顯式地去註冊,
三.springMVC的HandlerInterceptor介面使用
在SpringMVC 中定義一個Interceptor是比較非常簡單,主要有兩種方式:
- 第一種:實現HandlerInterceptor 介面,或者是繼承實現了HandlerInterceptor 介面的類,例如HandlerInterceptorAdapter;
第二種:實現Spring的WebRequestInterceptor介面,或者是繼承實現了WebRequestInterceptor的類。
HandlerInterceptor介面主要定義了三個方法:
1.boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handle)方法:該方法將在請求處理之前進行呼叫,只有該方法返回true,才會繼續執行後續的Interceptor和Controller,當返回值為true 時,就會繼續呼叫下一個Interceptor的preHandle就會繼續呼叫下一個Interceptor的preHandle 方法,如果已經是最後一個Interceptor的時候就會是呼叫當前請求的Controller方法;
2.void postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)方法:該方法將在請求處理之後,DispatcherServlet進行檢視返回渲染之前進行呼叫,可以在這個方法中對Controller 處理之後的ModelAndView 物件進行操作。
3.void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)方法:該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行,該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的檢視之後執行。用於進行資源清理。