在扩展WebMvcConfigurerAdapter
的我的类中,我想添加像这样的拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(new MyInterceptor());
}
MyInterceptor
是否必须声明为bean,或者我可以像我这样自己实例化它?
答案 0 :(得分:1)
根据官方文档,如果你在xml配置中声明它们,你的拦截器应该是Spring bean。
您的被叫方法:
InterceptorRegistration addInterceptor(HandlerInterceptor interceptor)
<强> 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容器本身。