[英]Which packages are considered in the component scan by Spring
我有一個 spring boot 應用程序,它使用標記接口來定義應該用於組件掃描的包:
@ComponentScan(basePackageClasses = {ModelComponents.class, WebComponents.class, ServiceComponents.class})
在ModelComponents
下的包中,定義了一個用作服務的接口,並在ServiceComponents
實現了它,但不知何故沒有被選中。
在 spring 包上使用調試級別調試(VM 選項: -Dlogging.level.org.springframework=DEBUG
)我可以看到前兩個組件中的所有 spring bean 都被選中,但沒有來自第三個組件。
啟用此調試信息比限制到更具體的包提供更多的輸出,如如何打開 Spring 的組件掃描調試信息中所述? ,但我從中得到的只是日志輸出,如:
DEBUG | .c.a.ClassPathBeanDefinitionScanner | | Identified candidate component class: file [...\ActivityLogService.class]
DEBUG | .c.a.ClassPathBeanDefinitionScanner | | Identified candidate component class: file [...TopayMwApplicationProperties.class]
DEBUG | .c.a.ClassPathBeanDefinitionScanner | | Identified candidate component class: file [...ChallengeService.class]
這告訴我找到的 bean 的所有信息,但它沒有給出關於其他 bean 的任何提示:因為包被忽略而沒有找到它們的位置,或者 spring 是否查看了基本包並沒有找到 bean?
有沒有辦法獲取組件掃描考慮哪個包或使用哪個標記接口的信息?
這將如何在日志中識別?
在這里,Spring 將在您指定的那些類的包下查找組件。 我的意思是Spring會搜索ModelComponents.class包、WebComponents.class包、ServiceComponents.class包下的組件。 所以
顯然,無法通過日志檢索此信息。 類org.springframework.context.annotation.ComponentScanAnnotationParser
確實將basePackageClasses
數組從注釋parse
為parse
方法中的包數組。
對該問題的調試表明,我使用了 3 個標記接口類,但只輸出了 2 個包。
由於問題中的示例不是現實生活中的示例,因此它沒有顯示全部真相,這導致了它:有兩個具有相同名稱的標記接口,但一個在另一個的子包中,另一個來自子包的導入並在basePackageClasses
使用了兩次。
因此,上面一個包中的 bean 不在被掃描的包中。
您提交的代碼看起來是正確的,盡管正如其他評論者所提到的,這可能是您的課程位置問題。 我用於設置要掃描的包的代碼是這樣的:
scanBasePackages = {"ru.company.package", "ru.company.anotherpackage"}
盡管由於可能的拼寫錯誤而不太安全,但它明確設置了包,並且可能會為您提供有關錯誤的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.