理解SpringBoot源码分析

1.Spring boot 简介

Spring Boot是由Pivotal团队提供的快速开发框架,基于SpringMVC通过注解+内置Http服务器如:tomcat-embed-core,简化了XML配置,快速将一些常用的第三方依赖整合(通过Maven继承依赖关系),最终实现以Java应用程序的方式进行执行。
Spring Boot 包含的特性如下:

  • 创建可以独立运行的 Spring 应用
  • 直接嵌入 Tomcat 或 Jetty 服务器,不需要部署 WAR 文件
  • 提供推荐的基础 POM 文件来简化 Apache Maven 配置
  • 尽可能的根据项目依赖来自动配置 Spring 框架
  • 提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查
  • 没有代码生成,也没有 XML 配置文件

Spring boot 加载
因为 Spring boot 内置了 Tomcat 或 Jetty 服务器,不需要直接部署 War 文件,所以 spring boot 的程序起点为一个普通的主函数,主函数类如下:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

看似和普通的程序没有什么区别,其实他最主要的步骤都通过注解 @SpringBootApplication 和方法 SpringApplication.run() 完成了。

SpringBoot启动流程
在这里插入图片描述

2.@SpringBootApplication注解分析

以下是注解@SpringBootApplication的源码实现

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration // 注解一
@EnableAutoConfiguration // 注解二
// 没有配置 basepackages,默认代表当前包及其子包
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM,
                classes = AutoConfigurationExcludeFilter.class) }) // 注解三
public @interface SpringBootApplication {
    // ...
}

注解一代表配置注解,如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}

有了这个注解,我们就可以把由 @SpringBootApplication 注解修饰的类作为配置类来使用,即在类 DemoApplication 中由 @Bean 注解修饰的代码都会被注入到 IoC 容器中由 Spring 统一管理。

注解三会自动扫描该类所在包,将各种组件注入到 IoC 容器中让其管理,所以我们也可以类 DemoApplication 上增加诸如 @Controller 的注解,将其作为一个 Controller。

@EnableAutoConfiguration

我们注意到 SpringBootApplication 注解同时由 @EnableAutoConfiguration 注解修饰,我们继续看 @EnableAutoConfiguration。

@EnableAutoConfiguration 的定义如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage  // 注解一
@Import(AutoConfigurationImportSelector.class) // 注解二
public @interface EnableAutoConfiguration {

}

3.剖析代码

查看SpringApplication的源代码可以发现SpringApplication的启动由两部分组成;

  • new SpringApplication(primarySources):创建SpringApplication对象
  • run(args):调用run方法

3.1实例化SpringApplication对象
源码如下:

 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        this.resourceLoader = resourceLoader;//1、初始化资源加载器
        Assert.notNull(primarySources, "PrimarySources must not be null");//2、断言资源加载类不能为 null
        this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));//3、初始化加载资源类集合并去重
        this.webApplicationType = deduceWebApplicationType();//4、 推断应用类型是Standard还是Web
        setInitializers((Collection) getSpringFactoriesInstances(
                ApplicationContextInitializer.class));//5、设置应用上下文初始化器
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//6、设置监听器 
        this.mainApplicationClass = deduceMainApplicationClass();//7、推断应用入口类
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值