【SpringBoot 框架】- SpringBoot 原理分析

  • SpringBoot 继承 spring-boot-starter-parent

  • spring-boot-starter-parent 继承 spring-boot-dependencies

【1】咱们可以进入 spring-boot-dependencies 看一看,按住 Ctrl 点击 spring-boot-dependencies,截取部分代码:

<activemq.version>5.15.3</activemq.version>

<antlr2.version>2.7.7</antlr2.version>

<appengine-sdk.version>1.9.63</appengine-sdk.version>

<artemis.version>2.4.0</artemis.version>

<aspectj.version>1.8.13</aspectj.version>

<assertj.version>3.9.1</assertj.version>

<atomikos.version>4.0.6</atomikos.version>

<bitronix.version>2.1.4</bitronix.version>

<build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>

<byte-buddy.version>1.7.11</byte-buddy.version>

… … …

org.springframework.boot

spring-boot

2.0.1.RELEASE

org.springframework.boot

spring-boot-test

2.0.1.RELEASE

… … …

org.jetbrains.kotlin

kotlin-maven-plugin

${kotlin.version}

org.jooq

jooq-codegen-maven

${jooq.version}

org.springframework.boot

spring-boot-maven-plugin

2.0.1.RELEASE

… … …

这些配置里面主要是定义一些坐标的版本、依赖管理、插件管理,这里会根据我们在spring-boot-starter-parent定义的版本来提供相应版本的匹配,这就很好的解决了Spring导入版本依赖冲突的问题,所以我们的 SpringBoot 工程继承 spring-boot-starter-parent 后已经具备版本锁定等配置了。

可以看出起步依赖的作用就是进行依赖的传递。

【2】在 spring-boot-starter-parent 中,还有一个地方咱们可以看一下,那就是资源引入:

true

${basedir}/src/main/resources

**/application*.yml

**/application*.yaml

**/application*.properties

可以看到,${basedir}/src/main/resources 表示资源的加载文件,资源文件包括下面三种格式的,也就是说,咱们在配置SpringBoot资源文件的时候都是以 application*.yml、application*.yaml、application*.properties文件格式

2、spring-boot-starter-web


spring-boot-starter-web 是web功能的起步依赖,导入了web功能的起步依赖后,可以不用导入Spring和SpringMVC的坐标,是因为starter-web 将坐标打包了,同样,可以来看看源码,按住 Ctrl 点击 spring-boot-starter-web,截取部分代码

<?xml version="1.0" encoding="UTF-8"?>

<project xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd” xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>

4.0.0

org.springframework.boot

spring-boot-starters

2.0.1.RELEASE

org.springframework.boot

spring-boot-starter-web

2.0.1.RELEASE

Spring Boot Web Starter

org.springframework.boot

spring-boot-starter

2.0.1.RELEASE

compile

org.springframework.boot

spring-boot-starter-json

2.0.1.RELEASE

compile

org.springframework.boot

spring-boot-starter-tomcat

2.0.1.RELEASE

compile

org.hibernate.validator

hibernate-validator

6.0.9.Final

compile

org.springframework

spring-web

5.0.5.RELEASE

compile

org.springframework

spring-webmvc

5.0.5.RELEASE

compile

可以看到,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。

二、自动配置原理解析

==========

自动配置其实就是将默认的配置自动加载进去,不需要我们去手动进行配置,在这里,我们还是以我的上一篇博客的环境搭建程序为例(https://blog.csdn.net/One_L_Star/article/details/103033571),依然是对源码进行分析,从mySpringBootApplication引导类开始:

@SpringBootApplication

public class mySpringBootApplication {

public static void main(String[] args) {

//将字节码引导参数传递给run方法

SpringApplication.run(mySpringBootApplication.class);

}

}

1、@SpringBootApplication注解


首先是@SpringBootApplication注解,咱们按住 Ctrl 点击 SpringBootApplication,进入 SpringBootApplication 注解源码瞧一瞧:

@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 {

@AliasFor(

annotation = EnableAutoConfiguration.class

)

Class<?>[] exclude() default {};

@AliasFor(

annotation = EnableAutoConfiguration.class

)

String[] excludeName() default {};

@AliasFor(

annotation = ComponentScan.class,

attribute = “basePackages”

)

String[] scanBasePackages() default {};

@AliasFor(

annotation = ComponentScan.class,

attribute = “basePackageClasses”

)

Class<?>[] scanBasePackageClasses() default {};

}

在这里我们可以看到,有一些其他的注解,咱们挑一些重要的注解来进行分析:

【1】@SpringBootConfiguration 注解

咱们可以按住 Ctrl 点进去看

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Configuration

public @interface SpringBootConfiguration {

}

可以看到 @SpringBootConfiguration 注解上面有一个@Configuration 注解,既标注该类是 Spring 的一个配置类 ,其实,@SpringBootConfiguration 注解就相当于Configuration注解,用于标注该类是 Spring 的一个配置类,和 Spring 中的@Configuration 注解是一个意思

【2】@EnableAutoConfiguration 注解

@EnableAutoConfiguration 注解是 SpringBoot 自动配置功能开启 ,同样,咱们可以按住 Ctrl 点进去瞧瞧

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import({AutoConfigurationImportSelector.class})

public @interface EnableAutoConfiguration {

String ENABLED_OVERRIDE_PROPERTY = “spring.boot.enableautoconfiguration”;

Class<?>[] exclude() default {};

String[] excludeName() default {};

}

可以看到,在上面有一个 @Import({AutoConfigurationImportSelector.class}) 注解配置,这是导入了AutoConfigurationImportSelector类,意思是自动配置导入选择器,咱们可以点进AutoConfigurationImportSelector类看看,截取部分源码:

图中框出来的表示加载某些配置,点进源码看一看:

protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {

List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());

Assert.notEmpty(configurations, “No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.”);

return configurations;

}

其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表,而这个文件就在当前类的包下面,咱们可以找到看一看:

点进spring.factories文件,里面有关自动配置的配置信息:

… … …

org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值