说明:在《spring boot搭建 hello word》用spring boot搭建了个hello word程序,当案例成功运行起来的时候我很好奇,我没有导入Spring相关的依赖,也没有配置Tomcat,那么hello word是如何跑起来的呢?我相信有很多初学者和我一样的迷茫,下面我以初学者的角度说明部分运行原理,可能不是太深奥哦!
首先我来回答一下上诉说明中的疑问,其实Spring Boot已经帮我们引入的web项目所需要的所有相关的jar包。
会发现这个pom会依赖另外一个项目,那不妨我们点进去瞅瞅有些啥......
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
当我们进来之后会发现里面还正是个世外桃源呀,但是仍然还有一个依赖,那不妨我们进去在看看有些啥....
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
进来之后会发现里面是管理Spring Boot应用里面的所有依赖版本. 就是因为这样我们的项目中才不需要我们手动的引入一些jar。
我们在回到最开始的pom,会发现默认的项目会帮我们引入spring-boot-starter-xxxxx,其实这个是spring官方为了让我们使用者更好实现功能的拓展,把每一个功能所需的jar都为我们封装起来了。我们只需要直接引入就行。例如下面的web模块,点进去会发现我们日常所需的jdbc、json、tomcat等jar都已经引入进来了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
相信大家都知道了Spring boot程序启动的入口,那么在这个入口中最为引起我们好奇的就是@SpringBootApplication 注解与SpringApplication.run()函数了。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
SpringBootApplication注解是干什么用的?
如果好奇那就不妨点进去看看,会发现里面有如下一大堆的其他注解。其实正如你看见的一样,它就是一个组合注解。 如果标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
虽然定义使用了多个注解进行了原信息标注,但实际上重要的只有三个是核心:
- @Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
- @EnableAutoConfiguration
- @ComponentScan
@Configuration:
@Configuration对我们来说不陌生,它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。在ssm中我们使用xml的形式去注入实体、设置某一个组件的信息等,现在只需要通过一个注解就可以直接设置。
@Configuration
2 public class RedisConfiguration{
3 .......
4 }
@EnableAutoConfiguration 开启自动配置功能
以前我们需要配置的东西,Spring Boot帮我们自动配置,@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效; 这个注解的底层使用的是@AutoConfigurationPackage也就是自动配置包.
Spring的底层注解@Import,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class;
将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;
它会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。
@ComponentScan
这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
注:主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件会扫描到Spring容器中,外面的包将不会被识别;
正是因为sping boot帮助我们把所有的相关依赖以及扫描包、注入sprig组件,才使得我们的初始化项目跑起来了。
spring Boot 整个执行流行原理:这篇博客写的很到位。