簡體   English   中英

@ComponentScan 在 Spring Boot AutoConfiguration 類中不起作用?

[英]@ComponentScan doesn't work in Spring boot AutoConfiguration class?

我正在嘗試創建一個新的啟動器。 我有一個業務模塊,比如說 ProjectManager,它包含一些用 @Component 注釋的類。 按照教程,我創建了一個自動配置模塊,它包含一個 AutoConfiguration 類。 首先,我嘗試使用 @ComponentSan 在我的業務模塊中查找 bean。

@ComponentScan(value = {"com.foo.project"})
@ConditionalOnClass({Project.class})
@Configuration
public class ProjectAutoConfiguration {
    ....

}

但它不起作用。 我必須添加額外的配置類,如下所示:

@Configuration
@ComponentScan(value = {"com.foo.project"})
@MapperScan(value = {"com.foo.project"})
public class ProjectConfig {
}

然后將其導入到 AutoConfiguration 類中,如下所示:

@Import(ProjectConfig.class)
@ConditionalOnClass({Project.class})
@Configuration
public class ProjectAutoConfiguration {
    ....

}

那行得通。 但是根據 spring 文檔

自動配置是用標准的@Configuration 類實現的

所以我的問題是,為什么 @ComponentScan 在這里不起作用? 我做錯了什么嗎? 還是設計使然?

您必須在主類中使用 compentscan 注釋。 這是一個示例代碼:

@SpringBootApplication
@ComponentScan("com.foo.project")
public class MainApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MainApplication.class);
    }

    public static void main(String[] args) {
        new MainApplication().configure(new SpringApplicationBuilder(MainApplication.class)).run(args);
    }
}

干杯

自動一切都需要 Application 類(用 @SpringBootApplication 注釋)位於比您要掃描的組件“更高”的包中。

使用:

package com.example.foo;

用於您的應用程序並將組件放入一個包中,例如:

package com.example.foo.entities;

另見https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

您可以嘗試以下嗎?

@ConditionalOnClass({Project.class})
@Configuration
@EnableAutoConfiguration
@ComponentScan(value = {"com.foo.project"})
public class ProjectAutoConfiguration {
    ....

}

我正在開發一個 SDK 項目。 它需要依賴SDK的應用程序在啟動期間掃描SDK中特定包下的bean。

在 autowire 配置類上使用 @ComponentScan 進行注釋不會生效。

然后我嘗試使用@Import 批注導入類實現的接口ImportBeanDefinitionRegistrar (接口由在處理@Configuration 類時注冊附加bean 定義的類型實現。在bean 定義級別操作時很有用(而不是@Bean 方法/實例級別)是需要的或必要的)。

在 ImportBeanDefinitionRegistrar 實現類中,我將一個用 @ComponentScan 注釋的類注冊為 bean。 再次運行應用程序,它按預期工作。

代碼如下:

自動配置類:

@Configuration
@Import(TestConfigRegistar.Registrar.class)
public class TestClientAutoCofiguration {

}

注冊類:

public class TestConfigRegistar {
public static class Registrar implements ImportBeanDefinitionRegistrar {
    private static final String BEAN_NAME = "componentScanConfig";

    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, 
                                                 BeanDefinitionRegistry registry) {
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(ComponentScanConfig.class);
        beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        beanDefinition.setSynthetic(true);
        registry.registerBeanDefinition(BEAN_NAME, beanDefinition);
    }
}
}

帶有@ComponentScan 注釋的類

// Leave an empty value of @ComponentScan will let spring scan
// current class package and all sub-packages
@ComponentScan
public class ComponentScanConfig {
}

我相信重點是必須在定義級別(而不是@Bean 方法/實例級別)定義用@ComponentScan 注釋的bean。 如果我錯了,請糾正我,謝謝。

暫無
暫無

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

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