拦截器必须是豆类吗?

时间:2016-11-18 14:15:31

标签: java spring-mvc

在扩展WebMvcConfigurerAdapter的我的类中,我想添加像这样的拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        super.addInterceptors(registry);
        registry.addInterceptor(new MyInterceptor());
    }

MyInterceptor是否必须声明为bean,或者我可以像我这样自己实例化它?

2 个答案:

答案 0 :(得分:1)

根据官方文档,如果你在xml配置中声明它们,你的拦截器应该是Spring bean。

您的被叫方法:

InterceptorRegistration addInterceptor(HandlerInterceptor interceptor)

来自https://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html  :

<强> org.springframework.web.servlet

接口HandlerInterceptor

  

拦截器本身在应用程序中定义为bean   上下文,由映射bean定义通过其引用   “拦截器”属性(XML:a)。

更新

javaguy所指的是让Spring进行bean的实例化。 它暗示你的拦截器遵循无国籍原则 要启用它,您的拦截器不应该具有状态(在拦截器执行期间更改的内部属性) 作为一般规则,当可能时,处理类应该尽量不保持状态。

这里你可以用Spring创建你的单例拦截器:

@Configuration
public class YourSpringConf{

  @Bean
    public HandlerInterceptor myInterceptor() {
       return new MyInterceptor();
    }
}

通过这种方式,您将拥有一个由Spring管理的名为myInterceptor的Bean,您可以使用addInterceptors()方法注入它。

答案 1 :(得分:1)

  

MyInterceptor必须被声明为bean还是我可以   像我这样自己实例化它?

大卫已经回答了,再补充一点:

如果存在单个对象,那么最好将它留给Spring容器来维护/管理它作为单例范围的bean(默认范围),而不是开发人员手动使用new MyInterceptor()并创建&amp; ;确保类的单个实例。

此概念不仅适用于MyInterceptor,而且需要遵循所有单例范围对象(如服务,DAO,过滤器等)。

进一步说明:

我的意思是当你控制(创造)​​少数豆子(如拦截器)时,那么在某个时间点,你的应用程序最终会处于凌乱的状态,即一些单例bean是由Spring Container维护,一些bean是由开发人员使用new运算符创建的(不容易区分,导致很多混乱)。所以最好的做法是将所有单例范围的bean(至少)创建到Spring容器本身。