@ComponentScan在Spring boot AutoConfiguration类中不起作用?

2022-09-04 01:32:34

我正在尝试创建一个新的启动器。我有一个业务模块,比如ProjectManager,其中包含一些用@Component注释的类。在本教程之后,我创建了一个自动配置模块,它包含一个自动配置类。首先,我尝试使用@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 {
}

然后将其导入到自动配置类中,如下所示:

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

}

这行得通。但根据春季文档

自动配置是使用标准@Configuration类实现的

所以我的问题是,为什么@ComponentScan在这里不起作用?我做错了什么吗?还是设计使然?


答案 1

你必须使用comptscan注释到主类中。下面是一个示例代码:

@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);
    }
}

干杯


答案 2

自动一切都要求 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


推荐