前言

在对公司的架构师沟通中,发现一些原理知识点掌握的程度多多少少存在问题。甚至有些同学对`spring-boot-starter`的作用与机制都完全不了。笔者感到要吐血.......

SpringBean扫描

在了解Spring-Boot-Starter之前, 先看如下Spring-Boot示例。

项目结构:

demo

|--demo-api API模块

|----DemoApplication.java

|------com.xxx.DemoController.java 注解@Controller的控制器

|--demo-service 服务模块

|----com.xxxx.DemoService.java

|------com.xxxx.impl.DemoServiceImpl.java 注解@Service的服务

66332da9f70d9ecb71298f53b64efd13.png

示例代码

fa31c4bb9608b07f71a99bc8c1591f47.png

注意,此时是会无法加载DemoService依赖的。(假定,DemoServiceImpl有实现,并且注解了@Service )。

因为,SpringBoot在启动的时候, 会自动扫描当前项目(模块)下的同级+子级包下,注解如@Controller,@Service,@Component的类,并加载到Bean容器中。

也就是说,不会扫描其他的模块。在上图的项目结构中,只能扫描到DemoController,而无法扫描到多模块的demo-service模块中的DemoServiceImpl。

因为@SpringBootApplication 中,注解了

63f06a7fb34b193717da57d0ce4c7ae0.png

默认是不会扫描其他的包。

219dfbe7128f1361264f388d4526f3e1.png

默认情况下,basePackages是空的,所以,最终只会扫描当前类declaringClass的包及子级包。

那么,如果扫描其他的子模块下的包呢?

25918e86ead451bda63c23ed36c74b40.png

这样,在启动类的时候,就以生效,会自动扫描"com.xxxx"包下的注解如@Controller,@Service,@Component的类,并加载到Bean容器中。

那么,如果存在各种不同命名的包结构,则需要配置一堆的basePackages

如何解决?

Spring-Boot-Starter

官方描述:Core starter, including auto-configuration support, logging and YAML

核心:包括自动配置支持,日志记录和YAML

Starters是用来快速处理项目依赖项。比如spring-boot-starter-data-redis,可以快速的自动将redis中的配置自动装载和初始化,而不需要额外的进行过多的配置或者初始化动作。

简单来说就是:Starters实现了自动的配置装载与内部依赖初始化动作。

实现原理

spring.factories

Spring-Boot-Starter简单来说,就是使用spring.factories来进行配置的自动化装载。(SPI机制)

如:

f76ee2d8040923c6595e6223a0aa5596.png

那么,在启动的时候,就会自动装载ProviderServiceAutoConfiguration包下及子级包的Bean

原理分析

主要实现在SpringFactoriesLoader类中。

821eb10a065513861f8dcdb57ea45e41.png
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐