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 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 before 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 after 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 渲染了对应的视图之后执行。用于进行资源清理。

你可能感兴趣的:(java)