Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker DevOps


自定义 Spring Boot Starter 中的组件无法被 Spring 扫描注册

Spring Boot 大约 1217 字

现象

自定义starter包中的@Controller@Service@Component@Bean等对象没有注入到Spring容器中。

原因

主项目包com.example.project,自定义starterorg.group.lib,在不同包下。

Spring Boot项目启动时会默认扫描@SpringBootApplication标注的类所在的子包下的路径。

解决

方法一

主项目@SpringBootApplication中添加scanBasePackages,包含自定义starter包的路径。

注意:主项目的路径也必须显示指定,否则主项目的组件不会被加载,从而项目报错无法启动。

@SpringBootApplication(scanBasePackages = {"com.example.project", "org.group.lib"})
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

方法二

主项目中添加@ComponentScan设置包含自定义starter包中的路径。

注意:主项目的路径也必须显示指定,否则主项目的组件不会被加载,从而项目报错无法启动。

@ComponentScan(basePackages = {"com.example.project", "org.group.lib"})
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

方法三

自定义starter包路径修改为与主项目一致,只适用于自己维护的starter包。

注意:可能会与主项目类冲突。

方法四

starter中定义@Configuration,并添加@ComponentScan

@ComponentScan(basePackages = "org.group.lib")
@Configuration
public class TestComponentConfig {

}

spring.factories中添加TestComponentConfig配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.group.lib.config.TestAutoConfiguration, \
org.group.lib.component.TestComponentConfig
阅读 103 · 发布于 2022-10-20

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批