带有 Spring Boot 中所需的显式 basePackages 的 IntegrationComponentScan?
Posted
技术标签:
【中文标题】带有 Spring Boot 中所需的显式 basePackages 的 IntegrationComponentScan?【英文标题】:IntegrationComponentScan with an explicit basePackages required in Spring Boot? 【发布时间】:2021-12-07 12:20:32 【问题描述】:我有一个使用 Spring 集成的 Spring Boot 应用程序(使用 Spring Boot 2.4.11)。我添加了org.springframework.boot:spring-boot-starter-integration
,因此我希望@IntegrationComponentScan
默认处于活动状态。事实上,我发现Issue 2037 似乎暗示了这一点。另外,我在org.springframework.boot.autoconfigure.integration.IntegrationAutoConfigurationScanRegistrar.IntegrationComponentScanConfiguration
上看到了该注释。
但是,我的 @MessagingGateway
注释接口没有被 Spring 占用。我试图在我的一个 @Configuration
类中添加一个显式的 @IntegrationComponentScan
,但它也不起作用。
一旦我还为该注释指定了明确的 basePackages
值,它就开始工作了,所以:
@Configuration
@IntegrationComponentScan(basePackages = "com.example.app.integration")
public class MyConfigurationClass
当然我的注释接口在com.example.app.integration
下面的一个包中。
我错过了什么吗?我在 Spring Boot 文档中找不到对 @IntegrationComponentScan
的任何引用。其他类似的注解(如 @EnableJpaRepositories
用于 Spring Data 或 @EntityScan
)并不是绝对必要的,除非您需要自定义扫描范围。
我还找到了Issue 3375,这似乎表明我应该看看@AutoConfigurationPackage
,但是:
basePackages
可能指向一些非常接近我的应用程序“根”的包
为什么其他@*Scan
注释不需要这个注释?
【问题讨论】:
【参考方案1】:我认为您需要展示您的项目结构。它按预期工作:
我有一个类似com.example.integration.gateway.MyGateway
的界面
我的主要课程在com.example.integration.IntegrationApplication
,内容如下:
@SpringBootApplication
public class IntegrationApplication
即使我在 com.example.integration
包中有 MyGateway
,它仍然有效。
总结。 @SpringBootApplication
用 @ComponentScan
标记,Spring 开始从声明了 @SpringBootApplication
的包中扫描组件,一直扫描到它的子包。
如果您的组件与 @SpringBootApplication
类不同,请考虑通过其 scanBasePackages
属性对其进行自定义:
/**
* Base packages to scan for annotated components. Use @link #scanBasePackageClasses
* for a type-safe alternative to String-based package names.
* <p>
* <strong>Note:</strong> this setting is an alias for
* @link ComponentScan @ComponentScan only. It has no effect on @code @Entity
* scanning or Spring Data @link Repository scanning. For those you should add
* @link org.springframework.boot.autoconfigure.domain.EntityScan @EntityScan and
* @code @Enable...Repositories annotations.
* @return base packages to scan
* @since 1.3.0
*/
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default ;
您的项目中的所有其他内容都需要进行调查。如果您可以与我们分享,我们可以看看并找到一些东西。
【讨论】:
以上是关于带有 Spring Boot 中所需的显式 basePackages 的 IntegrationComponentScan?的主要内容,如果未能解决你的问题,请参考以下文章
带有 LocalDateTime 的 Spring Boot 项目
表单提交错误,无法将类型“java.lang.String”的值转换为浏览器中所需的类型错误,在 Spring MVC 中