《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/u010013573/java/article/details/86685984 「服务端开发」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

一、概述

使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行。这是跟传统的将项目打包成war包,然后部署到tomcat服务器去运行的一个区别。

而在应用当中,这个包含main方法的启动类需要放在项目的根目录,与所有包平级,一般在main方法内部通过执行SpringApplication.run方法来启动应用。

启动类自身是一个基于注解的配置类,一般使用@SpringBootApplication注解,而这个注解由三个注解组成,分别是:@SpringBootConfiguration@ComonentScan@EnableAutoConfiguration。所以也可以单独使用这三个注解。

一个典型的SpringBoot项目结构如下:

二、注解分析

@SpringBootConfiguration:配置类

继承于@Configuration,本身只是说明这是一个SpringBoot项目的配置类,功能与@Configuration一样,使得Spring容器知道需要跟处理@Configuration注解的类一样处理这个类。

@ComponentScan:基于注解的类扫描

用于进行包扫描,检查类是否使用了@Controller,@Service等注解,有则获取这些类创建对应的bean对象注册到Spring容器;

@EnableAutoConfiguration:SpringBoot的自动配置特性

该注解是SpringBoot引入的,用于自动配置,即基于项目配置pom.xml引入的SpringBoot的starter相关包和项目添加的配置类,判断是使用SpringBoot的starter包提供的配置类还是使用项目定义的配置类,如假如在pom.xml中引入了spring-boot-starter-data-redis包,则如果项目没有自定义RedisTemplate类实现,则SpringBoot会自动配置和注入一个RedisTemplate对象到Spring的IOC容器中。

工作过程为:扫描项目的所有包,检测项目中是否存在与SpringBoot自动添加的starter包对应功能组件类相同的类,或者实现了相同的接口或者继承了相同的父类的类,有则使用项目自身提供的该功能组件类实现,没有则使用SpringBoot自动添加的该功能组件类。SpringBoot的starter包自动添加的这些功能组件类通常是使用了@Configuration注解和@Conditional注解的,所以可以实现条件化注入。

三、SpringApplication位于项目根目录的原因

@ComponentScan注解有个特性:如果不指定需要扫描的包或者需要注册的类,则默认是扫描该使用@ComponentScan注解的类所在的包以及子包,所以将使用了@SpringBootApplication注解的包含main方法的启动类放在项目根目录,则会扫描项目的所有包。

除了@ComponentScan注解之外,@EnableAutoConfiguration注解也是扫描使用了这个注解的类所在的包及其子包,故放在项目根目录,则可以扫描项目所有的包,对所有的类(具体为使用Spring容器管理的)进行检测,从而决定是否需要自动创建功能组件类的bean对象到spring的IOC容器中。

文章目录
  1. 1. 一、概述
  2. 2. 二、注解分析
    1. 2.1. @SpringBootConfiguration:配置类
    2. 2.2. @ComponentScan:基于注解的类扫描
    3. 2.3. @EnableAutoConfiguration:SpringBoot的自动配置特性
  3. 3. 三、SpringApplication位于项目根目录的原因