Spring Boot入门(一)

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 {
[email protected]注解(声名这个类是一个springBoot配置类)
  • 基于Spring的注解@Configuration实现
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
[email protected]注解(实现自动配置)
@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注解

[email protected]注解

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

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

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

[email protected]注解

出现背景:在之前的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)

原文地址:https://www.cnblogs.com/onlyzuo/p/12147022.html

时间: 2024-10-08 01:37:50

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

161103、Spring Boot 入门

Spring Boot 入门 spring Boot是Spring社区较新的一个项目.该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验,让Java开发也能够实现Ruby on Rails那样的生产效率.为Spring生态系统提供了一种固定的.约定优于配置风格的框架. Spring Boot具有如下特性: 为基于Spring的开发提供更快的入门体验 开箱即用,没有代码生成,也无需XML配置.同时也可以修改默认值来满足特定的需求. 提

构建微服务:Spring boot 入门篇

构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适). 使用spring boot有什

Spring Boot 入门之缓存和 NoSQL 篇(四)

原文地址:Spring Boot 入门之缓存和 NoSQL 篇(四) 博客地址:http://www.extlight.com 一.前言 当系统的访问量增大时,相应的数据库的性能就逐渐下降.但是,大多数请求都是在重复的获取相同的数据,如果使用缓存,将结果数据放入其中可以很大程度上减轻数据库的负担,提升系统的响应速度. 本篇将介绍 Spring Boot 中缓存和 NoSQL 的使用.上篇文章<Spring Boot 入门之持久层篇(三)>. 二.整合缓存 Spring Boot 针对不同的缓存

Spring Boot 入门之持久层篇(三)

原文地址:Spring Boot 入门之持久层篇(三) 博客地址:http://www.extlight.com 一.前言 上一篇<Spring Boot 入门之 Web 篇(二)>介绍了 Spring Boot 的 Web 开发相关的内容,项目的开发离不开数据,因此本篇开始介绍持久层相关的知识. 二.整合 JdbcTemplate 2.1 添加依赖 <dependency> <groupId>org.springframework.boot</groupId&g

Spring Boot 入门之消息中间件篇(五)

原文地址:Spring Boot 入门之消息中间件篇(五) 博客地址:http://www.extlight.com 一.前言 在消息中间件中有 2 个重要的概念:消息代理和目的地.当消息发送者发送消息后,消息就被消息代理接管,消息代理保证消息传递到指定目的地. 我们常用的消息代理有 JMS 和 AMQP 规范.对应地,它们常见的实现分别是 ActiveMQ 和 RabbitMQ. 上篇文章<Spring Boot 入门之缓存和 NoSQL 篇(四)>. 二.整合 ActiveMQ 2.1 添

Spring boot入门到精通视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

spring boot入门与进阶

视频课程包含: SpringBoot入门.SpringBoot进阶.Spring Cloud微服务.Spring Ecosystem 微服务相关.Spring Boot 入门 IDEA 版本.Spring Boot集成Dubbo示例等. 本视频属于作者原创搜集整理!下载方式:翻阅到文章底部 目录 00.SpringBoot入门 01.SpringBoot进阶 02.Spring Cloud微服务 03.Spring io New 04.Spring Ecosystem 微服务相关 06.Spri

Spring Boot入门——文件上传与下载

Spring Boot入门--文件上传与下载https://www.cnblogs.com/studyDetail/p/7003253.html 1.在pom.xml文件中添加依赖 复制代码 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

Spring Boot入门程序

创建第一个Spring Boot的入门程序. 带你一步一步的,搭建第一个Spring Boot 的入门程序,并成功运行,通过实践过程,初步认识和了解如何使用Spring Boot 创建应用程序. 一.开发环境 (1)JDK 1.8 (2)Eclipse Oxygen EE版本 或者也可以使用 IntelliJ IDEA (3)Tomcat 9 二.创建 Spring Boot 入门程序 1.创建工程 在Eclilpse EE中,点击"File"--"New"--&q

Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybatis和pagehelper 关于mybatis和pagehelper的介绍,可以自行博客,网上很多类似的博客,这里,我直接上代码和项目搭建教程. 1.配置文件:在配置文件application.yml中配置MySql数据库连接池和Mybatis扫描包以及PageHelper分页插件 1 mybati