为什么这不排除从Spring conf

时间:2018-05-08 12:18:08

标签: spring-boot

我有这样的困惑。

package com.data;

...

@SpringBootApplication
@ComponentScan(basePackages = "com.data",
    excludeFilters = {
            @ComponentScan.Filter(type = FilterType.REGEX, pattern = "scraping.*"),
            @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.data.DataGetter.AmazonSQS.*"),
            @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.data.Scraper.com.data.Scraper.LinkedInScraper")
    })
public class MinerApplicationWithProxyUserServiceEmulatingBrowserRabbit {

为什么这个conf仍然不排除并在第二个和第三个排除过滤器中创建bean?

2 个答案:

答案 0 :(得分:2)

正如已经提到的另一个答案,点在正则表达式中具有特殊含义,因为它几乎匹配任何字符。具有讽刺意味的是,这意味着您的正则表达式也可以正常工作,因为正则表达式中的.也匹配一个简单的点。

如果你想知道为什么你的第一个过滤器确实有用,那就是因为你已经将basePackages属性定义为com.data,所以它可能已被排除在外

这意味着你应该正确地转义你的包,并且你可以从过滤器中删除第一个包,因为它已经因基础包而被过滤了:

@ComponentScan(basePackages = "com.data",
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.data\\.DataGetter\\.AmazonSQS\\..*"),
        @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.data\\.Scraper\\.LinkedInScraper")
})
  

我最后使用\\..*,因为这意味着匹配最后一个点后的零到多个字符,而不是一个字符。

但是,从您当前的代码我无法解释为什么其他两个过滤器不起作用,因为它们应该。这只能意味着一些事情:

  1. 您拥有不同的包结构,例如:
    • 您的第三个过滤器使用com.data.Scraper包两次
    • 您的第三个过滤器最后没有使用.*,这意味着 LinkedInScraper是一个类名,而不是包。
    • 您的包不遵循命名约定(应全部小写)
  2. 您在其他地方有一个不同的@ComponentScan,其中包含其他两个包。

答案 1 :(得分:1)

对于REGEX过滤器,您必须以正则表达式值转义DOTS(。)。

所以你的配置应该是这样的,

@ComponentScan(basePackages = "com.data",
    excludeFilters = {
            @ComponentScan.Filter(type = FilterType.REGEX, pattern = "scraping.*"),
            @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.data\\.DataGetter\\.AmazonSQS.*"),
            @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.data\\.Scraper\\.com\\.data\\.Scraper\\.LinkedInScraper")
  

我真的希望你试试FilterType.ASPECTJ。这很美   在代码方面更清洁。