Spring Boot是如何跑起来的

说明:在《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 整个执行流行原理:这篇博客写的很到位。

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值