前面的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注解分析
点击@SpringBootApplication源码,可以看到这个注解是一个组合注解
我将核心注解与基础注解之前添加了一根分割线,并在核心注解上加了说明,核心注解如下
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
1.1、@SpringBootConfiguration
点击@SpringBootConfiguration
可以看到只有一个org.springframework.context.annotation.@Configuration注解,此注解所标记的类,会在Spring容器初始化的时候被扫描到,并解析其中的配置内容(例如@Bean标记的方法等)
1.2、@EnableAutoConfiguration
点击@EnableAutoConfiguration
此注解上面又有两个核心注解
- @AutoConfigurationPackage
- @Import(AutoConfigurationImportSelector.class)
1.2.1、@AutoConfigurationPackage源码如下:
只有一个核心注解:
- @Import(AutoConfigurationPackages.Registrar.class)
借助@Import导入了AutoConfigurationPackages.Registrar类到IOC容器,
通过AutoConfigurationPackages.Registrar来注册了一个类型为BasePackages的bean,其属性中保存了basePackageName。1.2.2中会分析@Import。
1.2.2、@Import注解
@Import注解只有基础注解,并有一个 value()属性,用来接收一个Class。
查看@Import注释
译:用于导入一个或多个组件类(通常是@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注解相关代码就分析完了。