当使用Spring时,在本例中是rest端点&使用Spring 2,我可以通过实现WebMvcConfigurer
接口为我的应用程序配置拦截器:
@Configuration
public class SpringWebConfig implements WebMvcConfigurer
{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor).addPathPatterns("/api/endpoint/**");
}
}
通过以下操作,我自动地将这个拦截器添加到我的大多数应用程序中:
com.company.api
。com.company.api
添加到api扫描中。这个公共包还包含拦截器和实用程序类,以使该拦截器工作,因此实际上,添加这个公共jar将自动将他拦截器添加到应用程序中的所有操作中,这与Spring本身所做的类似:添加依赖项会改变Spring的默认配置。
我现在面临的问题是,这种方法不能扩展到第二个jar中的第二个拦截器,因为我已经使用了WebMvcConfigurer
实现。我不能有两个。
我正在考虑可能使用某种组合配置模式,在这种模式中,我们遍历每个配置程序,收集所有拦截器,然后添加它们一次,但不幸的是Spring不允许这样做。我有什么选择?
目前,我采用的方法是在每一个需要它的应用程序中复制WebMvcConfigurer
接口。当事情发生变化时,我感到很难过,我必须在每个应用程序中更改相同的代码片段。
发布于 2019-06-01 05:33:09
如果我正确理解您的问题,基本上您希望在多个JAR中定义一些常见的Interceptors
,这样应用程序就可以通过简单地将这些JAR包含到应用程序中来激活这些Interceptors
?
我正在考虑可能使用某种组合配置模式,在这种模式中,我们遍历每个配置程序,收集所有拦截器,然后添加它们一次,但不幸的是Spring不允许这样做。我有什么选择? 那么,如果实现A返回只有拦截器A的注册表,而实现B返回只有拦截器B的注册表,那么spring会将两个注册中心合并成一个同时包含A和B的超级注册表,还是只选择一个,还是抛出没有唯一bean定义的错误?
实际上,Spring已经实现了这一特征。当存在多个WebMvcConfigurer
bean时,Spring只需调用它们的配置方法把它们一个一个地循环起来即可。因此最终的结果是InterceptorRegistry
将包含所有的拦截器.
如果客户端应用程序只需要激活某些WebMvcConfigurer
,它就可以简单地排除那些包含它们不需要的WebMvcConfigurer
的JAR。
为了进一步实现这个想法,允许应用程序控制哪个Interceptors
被激活到拦截器级别,您甚至可以在每个常见的JAR中执行以下操作:
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
//Make sure the HandlerInterceptor implementation in this JAR is a bean (e.g mark it as @Component)
@Autowired
private List<HandlerInterceptor> interceptors;
@Override
public void addInterceptors(InterceptorRegistry registry) {
for(HandlerInterceptor interceptor : interceptors){
registry.addInterceptor(interceptor).addPathPatterns("/api/endpoint/**");
}
}
}
在客户端应用程序中,使用includeFilters
/ excludeFilters
在@ComponentScan
中自定义要包含哪些拦截器。例如,要禁用某些Interceptors
,可以这样做:
@ComponentScan(
basePackages = {"com.company.api"},
excludeFilters={
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar1.Inteceptor1.class) ,
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar2.Inteceptor1.class)
})
发布于 2019-05-31 02:42:05
如果我正确理解了您的问题,您不希望在每个应用程序中实现WebMvcConfigurer
的所有方法。您只想添加相关的拦截器并完成它。
我的方法是通过在AbstractWebMvcConfigurerImpl
模块中实现WebMvcConfigurer
来创建Common
。只需保留addInterceptors()
抽象并实现其他方法即可。然后,您可以在每个Spring项目中扩展该抽象实现,并根据需要重写addInterceptors()
方法。
此外,您可以在Spring项目中拥有任意数量的WebMvcConfigurer
实现。因此,如果需要在Common
模块中定义一些公共拦截器,也可以在公共模块中扩展AbstractWebMvcConfigurerImpl
。
请注意,您所有的AbstractWebMvcConfigurerImpl
实现都应该使用@Configuration
进行注释。
https://stackoverflow.com/questions/56216178
复制