spring中几个常用的接口

青旅半醒 2022-05-26 01:54 325阅读 0赞

一.FactoryBean接口

BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂
FactoryBean: 以Bean结尾,表示它是一个Bean,不同于普通Bean的是:

它是实现了FactoryBean接口的Bean,根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,
而不是FactoryBean本身, 如果要获取FactoryBean对象,可以在id前面加一个&符号来获取

  1. package org.springframework.beans.factory;
  2. public interface FactoryBean<T> {
  3. T getObject() throws Exception;
  4. Class<?> getObjectType();
  5. boolean isSingleton();
  6. }
  7. FactoryBean 通常是用来创建比较复杂的bean,一般的bean 直接用xml配置即可,但如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean
  8. 很多开源项目在集成Spring 时都使用到FactoryBean,比如 MyBatis3 提供 mybatis-spring项目中的 org.mybatis.spring.SqlSessionFactoryBean

二.BeanPostProcessor接口使用

  1. BeanPostProcessor接口作用是:如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中。
  2. public interface BeanPostProcessor {
  3. /**
  4. * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean
  5. * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
  6. * or a custom init-method). The bean will already be populated with property values.
  7. */
  8. //实例化、依赖注入完毕,在调用显示的初始化之前完成一些定制的初始化任务
  9. Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
  10. /**
  11. * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean
  12. * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}
  13. * or a custom init-method). The bean will already be populated with property values.
  14. */
  15. //实例化、依赖注入、初始化完毕时执行
  16. Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
  17. }
  18. 由方法名字也可以看出,前者在实例化及依赖注入完成后、在任何初始化代码(比如配置文件中的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 渲染了对应的视图之后执行。用于进行资源清理。

发表评论

表情:
评论列表 (有 0 条评论,325人围观)

还没有评论,来说两句吧...

相关阅读