Spring Boot入门

一、第一个Spring Boot程序

1.导入springBoot 依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

2.创建包,控制器和主程序入口

@SpringBootApplication
public class MainSpringBoot {
public static void main(String[] args) {
SpringApplication.run(MainSpringBoot.class,args);
}
}

3.运行这个main方法访问控制层映射

第一个SpringBoot程序结束

二、解析入门程序

1.POM文件解析

1.1 spring Boot 依赖存在父依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<!--上面的父项目又依赖下面的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>

​ 第一个父项目用来加载Spring Boot启动需要加载的插件和资源文件

​ 第二个父项目用来加载所有的依赖版本,所以每次导入依赖的时候不需要书写版本号,spring boot默认会导入这个父项目中的版本。如果当前依赖在spring boot中没有进行依赖版本的控制,则需要书写版本号

1.2spring boot启动器

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--上面的依赖依赖下面的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
  • spring-boot-starter-web导入了一系列的web应用可以使用到的依赖
  • spring-boot-starters顾名思义,starters使用了复数,即为springboot启动器的合集
  • 这个启动器的合集中包含了所有可能需要用到的启动器,而启动器内部配置了所有的该工程下可能需要的所有依赖
    • 这个启动器依赖了spring-boot-starter-parent然后通过这个依赖获取了所有可能使用到的依赖的版本

2.解析主启动类

2.1 @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 {
2.1.1@SpringBootConfiguration注解(声名这个类是一个springBoot配置类)
  • 基于Spring的注解@Configuration实现
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
2.1.2@EnableAutoConfiguration注解(实现自动配置)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
  • @AutoConfigurationPackage注解(实现自动包导入)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {

Registrar是抽象类AutoConfigurationPackages的静态内部类,在Registrar中调用registerBeanDefinitions,该方法内部又调用AutoConfigurationPackages的另一个静态内部类PackageImport执行包导入。

debug模式下的运行结果为:我们自己的主程序入口的所在包,即springboot会扫描当前主程序所在包及其子包的所有文件

  • @Import({EnableAutoConfigurationImportSelector.class})

    • EnableAutoConfigurationImportSelector继承AutoConfigurationImportSelector类,其父类存在一个selectImports方法。
    • 该方法通过执行this.getCandidateConfigurations(annotationMetadata, attributes);获得相应的配置信息
    • getCandidateConfigurations方法内部,通过SpringFactoriesLoader.loadFactoryNames加载配置文件,最后作为一个list集合返回。具体加载的配置文件为META-INF/spring.factories

这是所有的自动导入的配置。有了这些自动导入,所以我们在使用的时候就不需要自己去配置,直接使用相应的功能即可。


​ 最新版本的springboot的@EnableAutoConfiguration注解发生了一些变化,不过和之前版本几乎相同。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

直接导入了AutoConfigurationImportSelector.class类,并且内部导入的组件从96增加到了124个

2.2Spring-boot-autoconfigurejar包

该包下的META-INF/maven/spring.factories文件中存放了所有的自动导入的配置

三、SpringBoot配置文件

1.YML格式配置文件

YML通过使用空格和缩进来决定层级关系。相比于XML和JSON格式来说可以更好的作为配置文件

person:
name: 张三
sex: 男

等价于

<person>
<name>张三</name>
<sex>男</sex>
</person>

1.1YML语法格式

属性:空格值

下面是YML对应的多种数据类型的写法

person:
name: 张三
age: 12
accounts: [a1,a2,a3]
tels:
- 123456
- 456789
- 789798
dogs: {frist:'12\n12',second:"12\n12"}
cats:
frist: 12
second: 13
brithday: 2018/12/8
sex: true

注:

  • 单引号里面的\会被转义,所以按照特殊的字符进行输出。即输出为frist=12\n12
  • 双引号里面的\不会被转一,所以按照原来的字符输出。即输出为second=12换行12
  • 对象,Map都是键值的方式,所在在YML配置文件中的写法相同
  • 数组,List,Set的写法相同

2.在springboot中注入YML配置文件

通过使用@ConfigationProperties(prefix='属性名')注解,参数指定需要注入的属性名。即上面YML数据的person

注:使用@ConfigationProperties注解的时候需要指定该Bean为容器中的组件,否则该注解无作用。

3.Properties和YML配置文件的区别

使用场景 @ConfigrationProperties @Value
松散绑定 支持 不支持
SPEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型注入 支持 不支持
  • 松散绑定指定是,frist-name(配置文件中的属性)和fristName(Bean中属性)。这种对应关系中,只有YML配置文件才可以读取到配置信息,properties文件读取不到
  • SpEL指SpringEL表达式
  • JSR303数据校验在springboot中,通过@Validated注解实现,指定该类需要进行数据校验,具体实现通过@Email,@Min,@Max等注解实现
  • 复杂类型指List,Set,Map等类型的注入

注:两者的使用场景,YML适用于批量注入数据;Properties适用于单个数据的注入

4.@PropertiesSource@ImportResource注解

4.1@PropertiesSource注解

出现背景:由于默认的springboot项目仅仅可以存在两个配置文件(application.properties和application.yml),而为了可读性,所以会将不同功能的配置文件分开。

作用:导入一个或多个配置文件

使用方法:@PropertiesSource(value={"classpath:person.properties","classpth:person.yml"}),之后通过@Value或者@ConfigationProperties注解注入对应值

4.2@ImportResource注解

出现背景:在之前的SSM项目整合的时候通常会使用xml进行配置,而springboot默认不读取xml文件,所以如果想要编写xml文件并且在springboot项目中使用的话,就需要使用@ImportResource注解

作用:导入一个或多个配置文件,将在xml中配置的信息导入到spring组件中

使用方式:@ImportResource({"classpath:bean.xml"})

5.配置文件占位符

5.1随机数

${random.uuid},${random.int},${random.int(10,20)}

5.1获取之前配置文件的值

person.frist-name=123
person.last-name=123
person.sex=${person.frist-name:1}

注:通过$(frist-name:默认值)来为这个属性指定一个默认值

6.Profiles文件

在实际开发中,不同的生产环境所需要的配置也不相同,所以需要多种配置文件去对不同的环境进行适应

6.1properties文件

profiles文件的格式:application-profiles.properties

例:application-dev.properties或者application-pro.properties等

在主配置文件中,通过spring.profiles.active=dev来激活对应的配置

6.2yml文件

yml文件支持多文档,通过---来分割不同的文档

server:
port: 8082
servlet:
context-path: /demo2
spring:
profiles:
active: dev
---
spring:
profiles: dev ---
spring:
profiles: pro

6.3激活对应的配置文件

  • 在主配置文件中激活
  • 在命令行参数中激活 java -jar spring…….jar --spring.profiles.active=dev此时的配置环境即为dev环境
  • 添加虚拟机参数,-Dspring.profiles.active=dev

7.配置文件加载顺序

​ 配置文件的加载存在四种加载方式,可以通过不同的配置文件的加载时间,来对项目进行不同环境的配置和升级

  • 当前项目的根目录下的conig文件夹
  • 当前项目的根目录下
  • 当前项目的资源文件下的config文件夹
  • 当前项目的资源文件下

以上的顺序即为springboot 加载配置文件的顺序

7.1加载外部的配置文件

在命令行中通过java -jar spring…….jar --spring.config.loation=盘符

7.2外部配置文件加载顺序

  1. 命令行参数方式。

    java -jar spring……jar --server.port=8082 --server.servlet.context-path=/abc --spring.config.location=盘符

  2. 来自java:comp/env的JNDI属性

  3. Java系统属性

  4. 操作系统环境变量

  5. RandomValuePropertySource配置的random.*属性值

  6. jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件

    和jar包在同一路径下的application.properties文件

  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件

  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

  10. @Configuration注解类上的@PropertySource

8.配置文件书写方式

在上面讲解springBoot主配置类的时候,提到了@EnableAutoConfiguration注解。这个注解给spring容器中导入了一些组件,这些组件来源于spring-boot-autoconfigure-2.2.2.RELEASE.jar!\META-INF\spring.factories文件,总共有124个

8.1自动配置原理

现在我们刨析一个组件的源码,看一下springboot是如何进行配置的。

@Configuration(
proxyBeanMethods = false
)
@EnableConfigurationProperties({HttpProperties.class})
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
  • @EnableConfigurationProperties注解导入了一个HttpProperties
@ConfigurationProperties(
prefix = "spring.http"
)
public class HttpProperties {
public static class Encoding {
public static final Charset DEFAULT_CHARSET;
private Charset charset;
private Boolean force;
private Boolean forceRequest;
private Boolean forceResponse;
private Map<Locale, Charset> mapping;

这个类导入了配置文件spring.http,也就是说我们在自己的配置文件中可以通过spring.http为HttpProperties中的属性赋值,所以为Encoding中的属性赋值的时候需要通过,spring.http.encoding.charset=UTF-8的方式,来进行赋值。

  • @ConditionalOnClass注解都是由@Conditional注解演变过来的
@Conditional扩展注解 作用(判断是否满足当前指定条件)
@ConditionalOnJava 系统的java版本是否符合要求
@ConditionalOnBean 容器中存在指定Bean;
@ConditionalOnMissingBean 容器中不存在指定Bean;
@ConditionalOnExpression 满足SpEL表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项
  • 自动配置类会在一定的条件下才能生效

    • 在自己的配置文件中添加debug=true属性;可以在控制台中打印自动配置报告,这样我们就可以知道哪些配置类生效了。
Positive matches: //生效的自动配置类
----------------- AopAutoConfiguration matched:
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition) AopAutoConfiguration.ClassProxyingConfiguration matched:
- @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) DispatcherServletAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)
- found 'session' scope (OnWebApplicationCondition) Negative matches: //没有自动配置的
----------------- ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition) AopAutoConfiguration.AspectJAutoProxyingConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) ArtemisAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

Spring Boot入门(一)的更多相关文章

  1. 161103、Spring Boot 入门

    Spring Boot 入门 spring Boot是Spring社区较新的一个项目.该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验 ...

  2. spring boot 入门操作(二)

    spring boot入门操作 使用FastJson解析json数据 pom dependencies里添加fastjson依赖 <dependency> <groupId>c ...

  3. spring boot 入门操作(三)

    spring boot入门操作 devtools热部署 pom dependencies里添加依赖 <dependency> <groupId>org.springframew ...

  4. Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序

    一.前言 什么是Spring Boot?Spring Boot就是一个让你使用Spring构建应用时减少配置的一个框架.约定优于配置,一定程度上提高了开发效率.https://zhuanlan.zhi ...

  5. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  6. Spring Boot 入门教程

    Spring Boot 入门教程,包含且不仅限于使用Spring Boot构建API.使用Thymeleaf模板引擎以及Freemarker模板引擎渲染视图.使用MyBatis操作数据库等等.本教程示 ...

  7. Spring Boot入门(五):使用JDBC访问MySql数据库

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序开发的过程中,操作数据库是必不可少的部分,前面几篇博客中,也一直未涉及到数据库的操作,本篇博客 就 ...

  8. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  9. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...

  10. Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值

    在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...

随机推荐

  1. Data Flow-File Read-详细过程

  2. HZOJ 模板(ac)

    调了一天,恶心死我了……作者的题解水的一b…… 测试点1-6: 暴力修改查询即可,期望得分30. 测试点7-14: k=1e5,相当于没有限制,那么对于树上每个点建权值线段树,线段树合并即可. 期望的 ...

  3. linux更新系统时间

    查看时间 date 更新时间 yum install ntpdate ntpdate time.windows.com

  4. CREATE OR REPLACE FUNCTION

    CREATE OR REPLACE FUNCTION SF_Taishou_Ksai_Date(v_receiptNum IN CHAR,                                ...

  5. Top 10 open source projects of 2015

    Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...

  6. 2018-9-1-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199

    title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2018-09-01 16:24: ...

  7. display的值和对应的意义

    none:隐藏对应元素,不为隐藏的对象保留其物理空间 block:指定对象为块元素 inline:指定对象为内联元素 inline-block:指定对象为内联块元素 table:指定对象为块元素的表格 ...

  8. 【Activiti工作流引擎】官方快速入门demo

    Activiti官方快速入门demo 地址: https://www.activiti.org/quick-start 0. 版本 activiti 5.22.0 JDK 1.8 1. 介绍 这个快速 ...

  9. git之本地仓库关联远程仓库

    首先新建一个github respository 然后在自己本地新建一个maven项目,里面写点东西 如下图,将自己的项目所在地设置为本地git仓库 将本地仓库与远程关联,首先获取远程仓库的地址,点击 ...

  10. 快速理解bootstrap,bagging,boosting,gradient boost-三个概念

      1 booststraping:意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法. 其核心思想和基本步骤如下: (1 ...