一.什么是Springboot

1.1 springboot以约定大于配置的核心思想

spring boot的优点

业务:service:userService:===>模块!

springmvc,controller===>提供接口!

http:rpc

用户下单:controller!

消息队列:

仓库冻结:资金冻结;验证;购买成功,仓库数量减少,仓库解冻,资金解冻

高类聚,低耦合

二.第一个springboot程序

jdk1.8

maven3.6.1

springboot:最新版

idea

官方:提供了一个快速生成的网站!Spring Initializr

  • 可以在spring官网直接下载后,导入idea开发
  • 直接使用idea创建一个新的springboot项目

官方文档:Spring Boot Reference Guide

三.原理初探

3.1自动配置

3.1.1pom.xml

核心依赖

 <dependencyManagement>
<!--        所依赖的框架  版本仓库--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

不需要指定版本,因为有版本仓库

启动器

   <!--            启动器,会帮我们自动导入web环境所有的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
  • 启动器:说白了就是springboot的启动场景
  • 比如spring-boot-starter-web,他会帮助我们自动导入web环境所有的依赖!
  • springboot会将所有的功能场景,都变成一个个的启动器
  • 我们使用什么功能,就只需要找到对应的启动器就可以了 starters

3.1.2主程序

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

注解@SpringBootApplication分析

@SpringBootConfiguration:springboot的配置@Configuration:spring的配置类@Component:说明这也是一个spring的组件@EnableAutoConfiguration:自动配置@AutoConfigurationPackage:自动配置包@Import({Registrar.class}):自动配置'包注册'@Import({AutoConfigurationImportSelector.class}):自动配置导入选择器//获取所有的配置List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

获取候选的配置

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> 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;}
META-INF/spring.factories:自动配置核心文件
META-INF/spring.factories

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

springboot加载的思维导图点下面的链接查看

https://www.processon.com/view/link/60dd44685653bb2a8d098b82

结论:springboot所有自动配置都在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动配置就会生效,然后配置成功!

  1. springboot在启动的时候,会从类路径下/META-INF/spring.factories获取指定的值
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置
  3. 以前需要我们自动配置的东西,现在springboot帮我们做了
  4. 整合javaee,解决方法和自动配置的东西都在spring-boot-autoconfigure-2.3.7.RELEASE.jar这个包下面
  5. 他会把所有需要导入的组件,以类名的方式返回,这些组件会被添加到容器
  6. 容器中也会存在非常多的xxxAutoConfiguration文件(@bean),就是这些类给容器中导入了这个场景需要的所有组件;并自动配置,@Configuration,javaConfig!
  7. 有了自动配置类,免去了我们手动编写配置注入功能主键等工作。

分析SpringApplication.run()

分析部分主要分两部分,一部分是SpringApplication的实例化,一部分是run方法的执行

SpringApplication
这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器 , 设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {// ......this.webApplicationType = WebApplicationType.deduceFromClasspath();this.setInitializers(this.getSpringFactoriesInstances();this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = this.deduceMainApplicationClass();
}

原文链接:https://blog.csdn.net/qq_33369905/article/details/106647293

关于springboot的理解:自动装配,run()

四.YAML

4.1yml的配置

@ConfigurationProperties(prefix="person")有可能会报红,需要去官网下载以下,添加到pom.xml(maven和gradle都有,一下是maven的)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
#对空格的要求十分高
server:port: 8080#普通的key-value
name: lianhua#对象
student:name: lianhuaage: 18#行内写法
student1: {name:lianhua01,age:18}#数组
pets:- cat- dog- pigpets1: [cat,dog,pig]

结果如下:

松散绑定:yml中的last-name可以与实体类中的lastName是一样的,可以绑定。-后面跟着的字母默认为大写

JSR303数据校验:这个就是我们可以在字段上增加一层过滤器验证,可以保证数据的合法性

复杂类型封装:yml中可以封装对象,使用@value就不支持了

结论:

配置yml和配置properties都可以获取到值 , 强烈推荐 yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!

4.2JSR303数据校验

相关验证的注解如下:

配置文件加载顺序目录如下:

多环境配置:

五,原理的再次整理

5.1自动装配的流程

我们进入一个xxxAutoConfiguration可以看到,这些类里面都有一些注解

//表示这是一个配置类
@Configuration(proxyBeanMethods = false
)
//自动配置属性:ServerProperties
@EnableConfigurationProperties({ServerProperties.class})//spring底层注解:根据不同的条件判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(prefix = "server.servlet.encoding",value = {"enabled"},matchIfMissing = true
)

其中自动配置属性,可以找到对应的类,可以看到这些类可以跟配置文件绑定,通过配置文件注入值。

5.2自动配置原理

狂神说的原理性粘贴

我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@Configuration //启动指定类的ConfigurationProperties功能;//进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;//并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties({HttpProperties.class}) //Spring底层@Conditional注解//根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;//这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(type = Type.SERVLET
)//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnClass({CharacterEncodingFilter.class})//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;//如果不存在,判断也是成立的//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(prefix = "spring.http.encoding",value = {"enabled"},matchIfMissing = true
)public class HttpEncodingAutoConfiguration {//他已经和SpringBoot的配置文件映射了private final Encoding properties;//只有一个有参构造器的情况下,参数的值就会从容器中拿public HttpEncodingAutoConfiguration(HttpProperties properties) {this.properties = properties.getEncoding();}//给容器中添加一个组件,这个组件的某些值需要从properties中获取@Bean@ConditionalOnMissingBean //判断容器没有这个组件?public CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));return filter;}//。。。。。。。
}

一句话总结 :根据当前不同的条件判断,决定这个配置类是否生效!

一但这个配置类生效;这个配置类就会给容器中添加各种组件;

这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;

配置文件能配置什么就可以参照某个功能对应的这个属性类

5.3.@Conditional

了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效;

@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。

我们怎么知道哪些自动配置类生效?

我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

#开启springboot的调试类
debug=true

Positive matches:(自动配置类启用的:正匹配)

Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)

Unconditional classes: (没有条件的类)

5.4.原理梳理

@SpringBootApplication里面的思维导图如下https://www.processon.com/view/link/60dd44685653bb2a8d098b82

从这个思维导图可以看出,自动配置,通过@SpringBootApplication 注解找到项目资源,spring.factories,通过扫描spring.factories里面的xxxAutoConfiguration 通过@Conditional派生注解判断配置类是否生效,如果生效,给容器中添加组件,这些组件的属性是从对应的properties类中获取的,可以根据配置文件(yaml或者property)设置值.

SpringApplication.run()

springboot知识一相关推荐

  1. springboot知识

    spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个We ...

  2. SpringBoot知识清单

    一.Spring IOC容器 1.1Spring IOC 你只需要告诉它你需要哪个bean,他就会把具体的实例发给你,至于这个实例是否依赖其他bean,如何完成初始化,你根本不需要关心 IoC容器想要 ...

  3. 使用IDEA搭建第一个SpringBoot程序

    近来在研究SpringBoot的使用,现在把使用IDEA搭建一个SpringBoot的HelloWorld程序记录下来 新建一个SpringBoot环境 打开你的IntelliJ IDEA,然后选择C ...

  4. SpringBoot企业级开发

    根据书籍<SpringBoot企业级开发教程>梳理SpringBoot开发框架,代码在本人Mac运行通过,IDE是IntelliJ. SpringBoot知识图谱: 链接:https:// ...

  5. (附源码)Springboot大学生综合素质测评系统 毕业设计 162308

    摘 要 本论文主要论述了如何使用java语言开发一个Springboot大学生综合素质测评系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.本文将论述 ...

  6. 计算机毕业设计springboot化妆品商城网站

    最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品 你的选题刚好在下面有,有时间看到机会给您发 1 ssm毕业生实习管理系统 2 jsp试题题库管理和试卷生成系统 3 ssm基于网络C++实 ...

  7. (附源码)springboot福佳生活超市进销存管理系统 毕业设计261620

    福佳生活超市进销存管理系统 摘 要 随着超市规模的发展不断扩大,商品数量急剧增加,有关商品的各种信息量也成倍增长.超市时时刻刻都需要对商品各种进销存信息进行统计分析.超市进销存管理系统开发的主要目是使 ...

  8. springboot福佳生活超市进销存管理系统毕业设计源码261620

    福佳生活超市进销存管理系统 摘 要 随着超市规模的发展不断扩大,商品数量急剧增加,有关商品的各种信息量也成倍增长.超市时时刻刻都需要对商品各种进销存信息进行统计分析.超市进销存管理系统开发的主要目是使 ...

  9. Springboot福佳生活超市进销存管理系统 毕业设计-附源码261620

    福佳生活超市进销存管理系统 摘 要 随着超市规模的发展不断扩大,商品数量急剧增加,有关商品的各种信息量也成倍增长.超市时时刻刻都需要对商品各种进销存信息进行统计分析.超市进销存管理系统开发的主要目是使 ...

最新文章

  1. UVA1455 - Kingdom(并查集 + 线段树)
  2. 动态性能视图v$lock访问很慢的解决办法
  3. 教育安全认证体系建设项目容灾备份体系建设项目
  4. iview-admin webpack打包总结的几个问题
  5. 模态框之Uncaught Error: Syntax error, unrecognized expression:
  6. 在用visio作图形界面设计,控件对齐的工具按钮
  7. keil 在项目栏总有个叉_老股民的热心分享:均线金叉死叉买卖定式”,散户值得一看!...
  8. php多进程有什么用,有关php多进程的用法举例
  9. android mtk 按键,Android 4.0 虚拟按键、手机模式、平板模式(转)
  10. BZOJ4698 SDOI2008Sandy的卡片(后缀自动机)
  11. Java中包、导包、修饰符和内部类
  12. makefile函数集锦【转】
  13. VS2010中配置OpenGL的一些问题小结
  14. cmd查看mysql的ip地址_怎么在cmd中查看数据库ip地?
  15. C++开发斗地主(QT)第五篇之牌型权重
  16. nginx 配置基于域名的虚拟主机
  17. Python格式化输出%.2f%%
  18. 不同类型的变量存放对应类型的数据,变量的值可以改变
  19. 深度卷积网络:第三课
  20. firefox不能正常下载文件

热门文章

  1. 基于jsp+mysql+ssm社会保险养老系统-计算机毕业设计
  2. 盘点| 小游戏运营分发平台
  3. js中通过name,或者id属性获取内容值
  4. 微信小程序 拨打电话功能
  5. g_signal_connect 与 g_signal_connect_swapped
  6. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:ESP8266 + DHT11 + 自定义微信告警
  7. [Unity实战]unity-webgl 转换 微信小游戏[简单上手][开箱可用]
  8. Laravel导出大量数据到表格csv及长数字显示不全问题
  9. android压感屏幕,原生Android确认支持压感屏:苹果懵逼了
  10. 物理学家:时间旅行有可能实现,但前提是……