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

Spring Boot About 1,217 words

现象

自定义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
Views: 1,695 · Posted: 2022-10-20

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

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

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


Today On History
Browsing Refresh