Spring Boot(1)-快速入门及自动配置源码剖析,入门就这篇足矣!

文章内容使用 Spring Boot 2.x

在这里插入图片描述

一、什么是Spring Boot

Spring Boot是基于Spring开发的,是约定大于配置的核心思想。并且集成了大量的第三方库配置比如redis、mongoDB、jpa等。Spring Boot就相当于maven整合了所有jar包,Spring Boot整合了所有框架。其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,并不少什么新的框架。

二、Spring Boot优点

优点其实就是简单、快速

  • 快速创建独立运行的Spring项目以及主流框架集成
  • 使用嵌入式的server容器,应用无需打成WAR包
  • starters自动依赖与版本控制
  • 有大量的自动配置,简化开发
  • 准生产环境运行应用监控
  • 与云计算的天然集成

之前不使用Spring Boot搭建web项目的过程是有多么繁琐

(1)配置 web.xml,加载 Spring 和 Spring mvc

(2)配置数据库连接、配置 Spring 事务、配置日志文件

(3)配置加载配置文件的读取,开启注解

(4)…

(5)配置完成之后部署 Tomcat 调试

三、Spring Boot快速玩转

Spring Boot到底有多诱人,相信大家都迫不及待了,赶紧撸一把试试手!

步骤一:新建项目

打开IDEA,新建项目,选择【Spring Initializr】 其他默认【Next】:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APs8wasf-1591172940642)(https://i.loli.net/2020/06/03/oxNcOZae6qdEsJb.png)]

修改完【next】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9MN62kG-1591172940646)(https://i.loli.net/2020/06/03/kLOaop3iJrvz8nX.png)]

勾选web模版

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-id0JpsH5-1591172940649)(https://i.loli.net/2020/06/03/YTQGf12tDcqBjAh.png)]

根据自己将项目存放路径,然后【finish】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ueu0Wfkb-1591172940653)(https://i.loli.net/2020/06/03/bqSUROJg28ByAX6.png)]

这样项目就搭建完成,Spring Boot目录结构如下
在这里插入图片描述

步骤二:编写controller层

建议:首先大家,在开发或者学习中,搭建好一个项目,先测试一下,看是否能跑起来。Spring Boot我们先来测试控制器,是否真的可以。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbJb8SVd-1591172940659)(https://i.loli.net/2020/06/03/U5zMiBcVwK87gus.png)]

编写一个userCotroller类代码如下:

package com.markjava.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    @GetMapping("/hello")
    @ResponseBody
    public String test() {
        return "hello spring boot";
    }
}

步骤三:启动项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7D76qK1-1591172940662)(https://i.loli.net/2020/06/03/LrcH1kY2Mylotp9.png)]

出现一下,说明你成功跑一个demo项目了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAb1Nped-1591172940665)(https://i.loli.net/2020/06/03/CqJFxfD4RUQ1kEp.png)]

打开浏览器访问输入 http://localhost:8080/hello,效果就出来啦,是不是简单。

如何修改端口号

resources目录下的application.properties添加或者``

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5sSTyaOl-1591172940670)(https://i.loli.net/2020/06/03/eKiSTjWLZVtO4nG.png)]

再次,打开浏览器访问输入 http://localhost:8081/hello

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zITTCrYi-1591172940673)(https://i.loli.net/2020/06/03/9rEa6BkLuHTNYMJ.png)]

Spring Boot热部署

其实,热部署在你构建项目的时候可以选择,或者通过pom.xml添加也是可以的,这样每次就不用都重启项目。

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

四、分析Spring Boot目录结构及pom.xml

基础结构共有3个 文件

  • src/main/java 程序开发以及主程序入口
  • src/main/resources 配置文件
  • src/test/java 测试程序

pom.xml文件中核心模块

<! --该标签是在配置 Spring Boot 的父级依赖:-->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
 </parent>
  
  <dependencies>
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
  </dependencies>
  • spring-boot-starter :核心模块,也是父级依赖,包括自动配置支持、日志和 YAML,如果引入了 spring-boot-starter-web web 模块可以去掉此配置,因为 spring-boot-starter-web自动依赖了 spring-boot-starter
  • spring-boot-starter-test :测试模块,包括 JUnit、Hamcrest、Mockito。

初学者,如果对源码有兴趣,请往下看会更精彩

五、主程序分析

//@SpringBootApplication标注这个类是一个Springboot的应用
@SpringBootApplication
public class Springboot02DemoApplication {
    public static void main(String[] args) {
        //将Springboot应用启动
        SpringApplication.run(Springboot02DemoApplication.class, args);
    }

}

SpringBootApplication源码剖析,进入源码,结果发现其实它是一个组合注解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WeL3jaEc-1591172940676)(https://i.loli.net/2020/06/03/VJm84AXEK9jCZeB.png)]

第一个SpringBootConfiguration注解:@SpringBootConfiguration–>是Spring Boot配置类。下面有一个叫@Configuration:它是配置类,下面又有@Component,其实它就是一个注入组件。

第二个@EnableAutoConfiguration注解:是开启自配配置功能

@AutoConfigurationPackage//自动配置包
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

@AutoConfigurationPackage:自动配置包,使用@Import(AutoConfigurationImportSelector.class)注解来完成的,它是spring boot底层注解,作用是给容器中导入组件。

六、自动配置原理

(1)Spring Boot启动的时候首先加载主配置类,开启啦自动配置的功能(@EnableAutoConfiguration)

(2)自动配置功能@EnableAutoConfiguration的作用:它是利用了@Import(AutoConfigurationImportSelector.class)给容器中导入一些组件。那么,他会给我们导入哪些组件呢?进入AutoConfigurationImportSelector源码看一下部分源码如下:

//@EnableAutoConfiguration注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

1⃣️@Import(AutoConfigurationImportSelector.class)自动配置导入选择

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
		ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
      //----部分源码省略----//
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
   //----部分源码省略----//
 }

List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);是获取候选的配置,也就是获取所有配置。

getCandidateConfigurations//获取候选配置,核心方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
  //SpringFactoriesLoader.loadFactoryNames通过加载器加载所有
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
				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;
	}

//getBeanClassLoader()
protected ClassLoader getBeanClassLoader() {
		return this.beanClassLoader;
	}
//beanClassLoader
private ClassLoader beanClassLoader;
//下滑,找到
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
				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;
	}
注:META-INF/spring.factories是配置文件的核心
//getSpringFactoriesLoaderFactoryClass()
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
		return EnableAutoConfiguration.class;//标注了这个类的所有包
	}

小结:将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加到容器中


2⃣️@AutoConfigurationPackage自动配置包

@Import(AutoConfigurationPackages.Registrar.class)//导入选择器,包注册
public @interface AutoConfigurationPackage {}

(3)每一个自动配置类进行自动配置功能

总结

(1)、SpringBoot启动会加载大量的自动配置类

(2)我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;

(3)我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)

(4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;

xxxxAutoConfigurartion:自动配置类;

给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

总结

使用 Spring Boot 可以非常方便、快速搭建项目,使我们不用关心框架之间的兼容性,适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以,所以使用 Spring Boot 非常适合构建微服务。(引自:Spring Boot(一):入门篇

参考资料

欢迎转载
欢迎关注公众微信号:MarkerJava

下一篇:thymeleaf模版引擎

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值