SpringBoot 源码分析—@SpringBootApplication

前面的web项目,简短几行代码零配置文件,就能够启动一个web工程,这是如何实现的呢?
实质上,SpringBoot帮我们做了很多自动化的配置,这些配置是一个个配置组建共同构成的

DemoApplication.java代码如下

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);
    }
}

DemoApplication.java中核心内容:

  • @SpringBootApplication注解
  • SpringApplication.run方法
    接下来,我们就通过源码SpringBoot究竟是怎样的完成自动化配置的,看看这里面究竟藏着怎样的秘密。

要分析SpringBoot源码,首先得搭建一个SpringBoot源码工程,步骤如下

  • 在github上,下载springboot源码并解压
  • 安装maven依赖
  • 在idea中打开springboot源码工程
    SpringBoot 2.2.X 以前是采用maven构建的,2.3.X以后是采用gradle构建的,这里我使用maven,所以采用2.2.X来分析

1、@SpringBootApplication注解分析

图片.png

点击@SpringBootApplication源码,可以看到这个注解是一个组合注解
我将核心注解与基础注解之前添加了一根分割线,并在核心注解上加了说明,核心注解如下

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

1.1、@SpringBootConfiguration

点击@SpringBootConfiguration


图片.png

可以看到只有一个org.springframework.context.annotation.@Configuration注解,此注解所标记的类,会在Spring容器初始化的时候被扫描到,并解析其中的配置内容(例如@Bean标记的方法等)

1.2、@EnableAutoConfiguration

点击@EnableAutoConfiguration


图片.png

此注解上面又有两个核心注解

  • @AutoConfigurationPackage
  • @Import(AutoConfigurationImportSelector.class)

1.2.1、@AutoConfigurationPackage源码如下:

图片.png

只有一个核心注解:

  • @Import(AutoConfigurationPackages.Registrar.class)
    借助@Import导入了AutoConfigurationPackages.Registrar类到IOC容器,
    通过AutoConfigurationPackages.Registrar来注册了一个类型为BasePackages的bean,其属性中保存了basePackageName。1.2.2中会分析@Import。

1.2.2、@Import注解

@Import注解只有基础注解,并有一个 value()属性,用来接收一个Class。


图片.png

查看@Import注释

图片.png

译:用于导入一个或多个组件类(通常是@Configuration所标记的类)。其特性与Spring XML 中的 <import/>标签类似, 可以导入 @Configuration标记的类、ImportSelector 和 ImportBeanDefinitionRegistrar 的实现类,以及普通Component组建(从 4.2 开始;类似于 AnnotationConfigApplicationContext.register)。
在导入的@Configuration 类中声明的@Bean 定义,可以通过@Autowired 来注入使用。 要么bean 本身可以被autowired,要么定义bean配置类实例可以被autowired。 后一种可以@Configuration 标记的配置类方法之间进行显式的、IDE 友好的导航跳转。可以标记在类上或其他注解上。如果需要导入 XML 或其他非@Configuration bean 定义资源,请改用@ImportResource 注解。
翻译水平有限,将就着看吧。简而言之:这是一个用于导入其他组建或者配置类的注解。

1.3 @ComponentScan

@SpringBootApplication中是这样使用的:
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})
@ComponentScan全路径是org.springframework.context.annotation.@ComponentScan,其本身是spring ioc中定义的,用于定义IOC容器初始化时应该扫描并加载哪些包中的组建或配置类。
@Filter用于排除所指定的需要被扫描的包中的某些类。

至此,@SpringBootApplication注解相关代码就分析完了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容