簡體   English   中英

Spring在組件掃描中考慮了哪些包

[英]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包下的組件。 所以

  1. 如果您的實現類不在這些包之一下,那么它將被忽略。
  2. 如果您的實現類沒有被注釋為 Spring 組件,那么它將被忽略

顯然,無法通過日志檢索此信息。 org.springframework.context.annotation.ComponentScanAnnotationParser確實將basePackageClasses數組從注釋parseparse方法中的包數組。

對該問題的調試表明,我使用了 3 個標記接口類,但只輸出了 2 個包。

由於問題中的示例不是現實生活中的示例,因此它沒有顯示全部真相,這導致了它:有兩個具有相同名稱的標記接口,但一個在另一個的子包中,另一個來自子包的導入並在basePackageClasses使用了兩次。

因此,上面一個包中的 bean 不在被掃描的包中。

您提交的代碼看起來是正確的,盡管正如其他評論者所提到的,這可能是您的課程位置問題。 我用於設置要掃描的包的代碼是這樣的:

scanBasePackages = {"ru.company.package", "ru.company.anotherpackage"}

盡管由於可能的拼寫錯誤而不太安全,但它明確設置了包,並且可能會為您提供有關錯誤的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM