我有这样的困惑。
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?
答案 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")
})
我最后使用
\\..*
,因为这意味着匹配最后一个点后的零到多个字符,而不是一个字符。
但是,从您当前的代码我无法解释为什么其他两个过滤器不起作用,因为它们应该。这只能意味着一些事情:
com.data.Scraper
包两次.*
,这意味着
LinkedInScraper
是一个类名,而不是包。@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
。这很美 在代码方面更清洁。