带有 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,但是:

我在 Spring Boot 文档中找不到任何提及此注释的内容 我怀疑这将适用于 Spring Boot 启用的任何其他“扫描”注释,因此在这种情况下,我的 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 项目

Spring-处理自动装配的歧义性

Spring Boot

表单提交错误,无法将类型“java.lang.String”的值转换为浏览器中所需的类型错误,在 Spring MVC 中

Sql - WHERE 条件的显式顺序?

Spring-Boot REST - 所需的字符串参数不存在