IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> IDEA-快速构建SpringBoot项目及SpringBoot的基本参数配置 -> 正文阅读

[Java知识库]IDEA-快速构建SpringBoot项目及SpringBoot的基本参数配置


前言

本章将介绍使用 IDEA 工具如何快速构建 SpringBoot 项目,以及 SpringBoot 项目的起步依赖原理分析,SpringBoot 的配置以及配置的加载顺序。


一、SpringBoot 概述

SpringBoot 概念

SpringBoot 提供了一种快速使用 Spring 的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。2014年4月,Spring Boot 1.0.0 发布。Spring 的顶级项目之一( https://spring.io )。

Spring 缺点

  1. 配置繁琐
    虽然 Spring 的组件代码是轻量级的,但它的配置却是重量级的。一开始, Spring 用 XML 配置,而且是很多 XML 配置。Spring 2.5 引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式 XML 配置。Spring 3.0 引入了基于 Java 的配置,这是一种类型安全的可重构配置方式,可以代替 XML 。所有这些配置都代表了开发时的损耗。因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring 实用,但它要求的回报也不少。
  2. 依赖繁琐
    项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

SpringBoot 功能

1)自动配置
Spring Boot 的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring 配置应该用哪个,不该用哪个。该过程是 SpringBoot 自动完成的。
2)起步依赖
起步依赖本质上是一个 Maven 项目对象模型( Project Object Model,POM ),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
3)辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
Spring Boot并不是对 Spring 功能上的增强,而是提供了一种快速使用Spring 的方式。

二、SpringBoot 快速入门

1.使用IDEA快速创建 SpringBoot 项目

本操作需要网络环境良好,否则无法快速搭建。

菜单选择 File -> New -> Project,选择 Spring Initializr。
在这里插入图片描述
点击 Next 进入下一步,选择语言以及项目打包方式,并且指定 Java 版本。
在这里插入图片描述

点击 Next 进入本页面,可以选择项目需要的依赖,这里我选择了 Spring Web 的依赖以及 LomBok 的依赖。
在这里插入图片描述
点击 Next 进入本页面,填写项目名称,点击 Finish 创建项目。
在这里插入图片描述
项目创建成功后,点击 File -> Settings,如图配置项目的 Maven 信息。
在这里插入图片描述
创建测试类,启动并访问项目。

package com.springboot.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello SpringBoot!";
    }
}

SpringBoot 的引导类,是项目入口,运行 main 方法就可以启动项目。
在这里插入图片描述
启动项目,浏览器访问接口,成功返回 ‘Hello SpringBoot!’ 。
在这里插入图片描述

使用 Spring 和 SpringBoot 构建的项目,业务代码编写方式完全一样。

2.SpringBoot 起步依赖原理分析

打开项目的 pom.xml 文件,可以看到自动引入了 spring-boot-starter-parent 以及 spring-boot-starter-web 两个坐标。
在这里插入图片描述
1)spring-boot-starter-parent
本坐标是项目依赖的父工程,点进去可以发现它又依赖于 2.6.1 版本的 org.springframework.boot 父工程。
在这里插入图片描述
进入这个坐标可以发现 标签中定义了很多常用技术的版本信息,这些都是 spring-boot-starter-parent 整合好的,组合了一套最优的技术版本,我们不需要自行再去选择版本,这样的好处就是不会存在版本冲突的问题。
在这里插入图片描述
2)spring-boot-starter-web
因为我已经依赖于 spring-boot-starter-parent 父工程,在父工程中,已经通过版本锁定,定义好了 spring-boot-start-web 的版本信息,所以在这里不需要指定版本.
点击进入 start-web 可以发现这个坐标依赖的一些坐标信息,此处没有版本锁定。
在这里插入图片描述
可以看到其中依赖了 spring-web 以及 spring-webmvc 两个坐标信息,通过依赖传递的特性,本项目也就依赖了 spring-boot-starter-web 中的坐标。

小结:
1.spring-boot-starter-parent 中定义了各种技术的版本信息,组合了一套最优搭配的技术版本。
2.在各种 starter 中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
3.我们的工程继承 parent 的 jar 包,并且不会存在版本冲突等问题。引入 starter 后,通过依赖传递,就可以简单方便获得需要的依赖

SpringBoot配置

配置文件分类

SpringBoot 是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties 或者 application.yml / application.yaml 进行配置。

  • properties
server.port=8080
  • yml
server:
	port: 8080

SpringBoot提供了2种配置文件类型:properties 和 yml/yaml
默认的配置文件名称为:application
在同一目录下配置文件的优先级为:properties > yml > yaml

YAML

YAML 全称是 YAML Ain’t Markup Language 。YAML 是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持 YAML 库的不同的编程语言程序导入,比如: C/C+ + , Ruby, Python, Java, Perl, C#, PHP 等。YML 文件是以数据为核心的,比传统的 xml 方式更加简洁。
YAML 文件的扩展名可以使用 .yml 或者 .yaml 。

  • properties
server.port=8080
server.address=127.0.0.1
  • xml
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
  • yml
server:
	port: 8080
	address: 127.0.0.1

yaml 的特点是简洁,以数据为核心。

基本语法

  • 大小写敏感
  • 数据值前边必须有空格,作为分隔符
  • 使用空格缩进表示层级关系,相同缩进表示同一级
  • 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略。

YAML数据格式

  • 对象(map):键值对的集合。
person:
	name: xinghe
# 行内写法
person: {name: xinghe}
  • 数组:一组按次序排列的值
address:
	- beijing
	- guangzhou
# 行内写法
address: [beijing,guangzhou]

数组使用 “-” 表示数组每个元素

  • 纯量:单个的、不可再分的值
# 单引忽略转义字符
msg1: 'hello \n xinghe'
# 双引识别转义字符
msg2: "hello \n xinghe"

YAML参数引用

  • 纯量:单个的、不可再分的值
name: xinghe

person:
	# 引用上面定义的name值
	name: ${name}

读取配置文件内容

  • @Value
package com.springboot.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Value("${name}")
    private String name;

    @Value("${person.name}")
    private String personName;

    @Value("${address[0]}")
    private String[] address1;

    @RequestMapping("/hello")
    public String hello() {
        System.out.println(name);
        System.out.println(personName);
        System.out.println(address1);
        return "Hello SpringBoot!";
    }
}
  • Environment
package com.springboot.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Value("${name}")
    private String name;

    @Value("${person.name}")
    private String personName;

    @Value("${address[0]}")
    private String[] address1;

    @Autowired
    private Environment environment;

    @RequestMapping("/hello")
    public String hello() {
        System.out.println(name);
        System.out.println(personName);
        System.out.println(address1);
        System.out.println("-----------------------------------");
        System.out.println(environment.getProperty("person.name"));
        System.out.println(environment.getProperty("address[0]"));
        return "Hello SpringBoot!";
    }
}
  • @ConfigurationProperties
    这里需要创建一个 Peson 类,以读取配置文件的内容。

@Data
本注解会自动生成get和set以及其他的一些方法,这里不多做解释。
@component
是spring中的一个注解,它的作用就是实现bean的注入。
@ConfigurationProperties
Spring源码中大量使用了ConfigurationProperties注解,比如server.port就是由该注解获取到的,通过与其他注解配合使用,能够实现Bean的按需配置。
该注解有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,该注解可以放在类上,也可以放在方法上。

package com.springboot.demo;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private String age;
}

使用 @ConfigurationProperties 注解 IDEA 会提示 “Spring Boot Configuration Annotation Processor not configured” ,在 pom.xml 文件中添加一个依赖就可以解决。

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

在 Controller 中注入 Person 对象就可以使用其读取的配置文件的值。

package com.springboot.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Value("${name}")
    private String name;

    @Value("${person.name}")
    private String personName;

    @Value("${address[0]}")
    private String[] address1;

    @Autowired
    private Environment environment;

    @Autowired
    private Person person;

    @RequestMapping("/hello")
    public String hello() {
        System.out.println(name);
        System.out.println(personName);
        System.out.println(address1);
        System.out.println("-----------------------------------");
        System.out.println(environment.getProperty("person.name"));
        System.out.println(environment.getProperty("address[0]"));
        System.out.println("-----------------------------------");
        System.out.println(person.getName());
        System.out.println(person.getAge());
        return "Hello SpringBoot!";
    }
}

profile

在开发 SpringBoot 应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。 profile 功能就是来进行动态配置切换的。

1)profile 配置方式

1.多 profile 配置方式

可以提供多个配置文件,每一个代表一种环境。
在这里插入图片描述
application-dev.properties/yml 开发环境
application-test.properties/yml 测试环境
application-pro.properties/yml 生产环境
通过在 application.properties/yml 中编写如下代码指定某个配置文件实现各个环境的切换激活。

spring:
  profiles:
    active: dev
2.yml 多文档方式

在 yml 文件中通过 “—” 分隔不同的配置。
通过 spring.profiles 来指定不同的配置名称,同样以 spring.profiles.active 来指定激活哪个配置。

---
server:
  port: 8081
spring:
  profiles: dev
---
server:
  port: 8082
spring:
  profiles: test
---
server:
  port: 8083
spring:
  profiles: pro
---
spring:
  profiles:
    active: test

2)profile 激活方式

1.配置文件

在配置文件中配置:spring.profiles.active=dev ,同上

2.虚拟机参数

在 VM options 指定:-Dspringprofiles.active=dev
在这里插入图片描述

3.命令行参数

在 Program arguments 指定:–springprofiles.active=dev
在这里插入图片描述
通过打 jar 包的方式在 jar 包根目录打开命令行运行 java -jar xxx.jar --spring.profiles.active=dev 命令也可以指定激活配置文件。
在这里插入图片描述

内部配置加载顺序

Springboot 程序启动时,会从以下位置加载配置文件:

  1. file:./config/:当前项目下的 /config 目录下
  2. file:./ :当前项目的根目录
  3. classpath:/canfig/:classpath的 /config 目录
  4. classpath:/ :classpath 的根目录加载顺序为上文的排列顺序,高优先级配置的属性会生效
    如果在不同的位置中有多个文件,那么多个文件都会加载,会形成一种互补的配置。

外部配置加载顺序

可以通过官网查看外部属性加载顺序
进入官网后找到外部化配置菜单,从低到高依次排序:
在这里插入图片描述
继续向下寻找可以看到,可以通过命令可以直接指定激活外部的配置文件:
在这里插入图片描述
比如我有一个配置文件在E盘的根目录下,那么我就可以在运行启动命令的后面加上 “–spring.config.location=e://application.properties” 指定激活我的配置文件。
在这里插入图片描述
也可以把配置文件放在 jar 包所在的 target 根目录下,跟jar包同级的情况下直接运行jar包,就可以自动激活配置文件,还可以在 target 目录下 创建 config 文件夹,在文件夹中放入配置文件,启动时同样也会自动激活。
由此可以看出外部配置和内部配置形成了一种互补的关系。
例如:
当项目打包完毕后,我突然发现有一些配置忘记调整过来,或者没有指定到生产环境的配置,那么现在就有两种解决方案:
1.修改项目配置文件后重新打包。
2.使用外部配置,把少量需要修改的配置放在外部配置文件中,因为外部配置的优先级较高,所以项目启动时就会覆盖掉项目内相应的配置信息。

今天就分享到这里,后续我还会继续发布一些自己的学习内容,希望可以跟大家共同进步。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:37:29  更:2021-12-02 16:39:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:40:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码