1. 程式人生 > >spring中幾個常用的介面

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 渲染了對應的檢視之後執行。用於進行資源清理。