核心注解

  • @SpringBootApplication: 标识一个类作为SpringBoot的启动类,是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan的组合
  • @SpringBootConfiguration:配置类,用于定义一个Bean,是一个特殊的@Configuration注解,用于加载配置
  • @EnableAutoConfiguration:用于启动自动配置的功能,可以自动引入相关的配置,减少开发成本
  • @ComponentScan:定义Spring扫描包的路径,用于发现应用程序中的bean、组件、配置类和服务等,可以自动扫描并注册包路径下的带有@Component、@Service等注解的类

自动装配是什么

自动装配可以根据项目中添加的依赖和其他因素,自动创建和配置Spring应用所需要的Bean,开发者不需要书写大量的XML配置或者Java配置类来设置Spring容器

自动化配置原理

  1. 自动化配置首先从组件说起,@SpringBootApplication是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan的组合
  2. 其中@EnableAutoConfiguration通过@Import注解将AutoConfigurationImportSelector.class这个类引入进来
  3. AutoConfigurationImportSelector.class会加载jar包的META-INF下面的spring-factories配置文件,其实用到了SPI机制
  4. spring-factories配置文件是一个key-value的形式,key是EnableAutoConfiguration的全路径名,value是各个需要配置的类,然后SpringBoot默认在这个配置类里面定义了100多个常用的配置类,然后再根据Condition按需加载我们的配置类,比如在配置文件中增加了对应的类才会生效

SPI

当接口存在于调用方这边,就是SPI。由调用方设计接口,然后由不同的厂商去根据这个规则接口进行实现,从而提供服务

API接口实现在厂商,调用方去获得服务

@ComponentScan默认扫描路径

默认扫描

在SpringBoot中使用@ComponentScan()注解进行组件扫描加载类时,默认的扫描范围是启动类([ProjectName]Application)所在包(直接父包)的子包。也即需要被扫描的包下的类要位于启动类所在路径下

  • 正确扫描:
1
2
3
4
5
6
7
src
main
java
com.cdfy.test
testApplication
controller
testController
* 分析: testController位于testApplication所在包com.cdfy.test下
* 启动类所在路径: com/cdfy/test/
  • 错误扫描:
1
2
3
4
5
6
7
8
9
src
main
java
com.cdfy.test
application
testApplication
controller
testController

* 分析:此时testApplication所在包为application,而controller和application无包含关系,则扫描不到controller下面的包,会造成bean创建失败。
* 启动类所在路径: com/cdfy/test/application

自定义扫描

若当前情况下,其他类不在application类所在包的子包中,但还需扫描作为bean供创建对象,则可以手动添加扫描的包。 使用@ComponentScan(“包路径”)。注意是添加,不是更新

解决上面的错误示范:

1
2
3
4
5
@ComponentScan("com.cdfy")
@SpringBootApplication
public class testApplication {
//1.创建log日志
private static final Logger LOG = LoggerFactory.getLogger(testApplication.class);