springBoot快速开发+配置使用+整合mvcjunitdtuidmybatisredis

Posted ahcfl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springBoot快速开发+配置使用+整合mvcjunitdtuidmybatisredis相关的知识,希望对你有一定的参考价值。

一、SpringBoot简介

1. 原有Spring优缺点分析

1.1 Spring的优点分析

Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

1.2 Spring的缺点分析

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。

所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。

除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

2. SpringBoot的概述

2.1 SpringBoot解决上述Spring的缺点

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

2.2 SpringBoot的特点

  • 为基于Spring的开发提供更快的入门体验
  • 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
  • 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
  • SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式

2.3 SpringBoot的核心功能

  • 起步依赖

    起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。

    简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

  • 自动配置

    Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

二、开发快速入门

1. Spring Initializr方式

spring官网 Spring Initializr

1.点击上述地址,直接来到springboot官网的工程创建页面
2.根据官网提示,配置坐标依赖等等。
3.等待工程下载,直接使用idea工具打开即可
4.在启动类同级或者自己目录下创建controller
5.运行启动类即可
6.浏览器访问测试

image-20210612155538795

下载完成解压后,直接在idea打开,然后在Controller层编写如下代码

@RestController
public class DemoController {

    @RequestMapping("/demo")
    public String demo(){

        return "hello springBoot";
    }
}

运行启动类即可

image-20210612160523630

访问/demo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7KWy4HEj-1624425855541)(C:\\Users\\16096\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210612160612819.png)]

注意:我们创建的所有的包必须是启动类的同级或者子级。

2. idea(Spring Initializr)

1.根据idea工具中提供的Spring Initializr,根据步骤提示创建,和官网差不多
2.编写controller
3.运行启动类
4.浏览器测试
image-20210612161500180

同上创建Controller层编写代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KE2gmsTa-1624425855544)(C:\\Users\\16096\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210612163443679.png)]

运行启动类,访问/demo

3. idea手动方式(推荐)

1.创建普通maven工程
2.引入springBoot父工程
3.引入springBoot的web启动依赖
4.编写controller
5.编写启动类,执行启动类

pom.xml

引入springBoot父工程
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
 </parent>

引入springBoot的web启动依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

同上创建Controller层编写代码

编写启动类,执行启动类

package com.ahcfl.springBoot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootStart {

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

话外(工程的启动方式)

1、 启动类

2、springBoot插件

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
image-20210612164929642

3、 java -jar jar包名成来执行

1.引入上述的插件
2.通过maven命令打成jar包
3.来到工作磁盘的工程目录的target中,cmd
4.通过  java -jar  jar包名成来执行

注意:
正常开发环境,都是启动类直接启动
生产环境,一般都是打jar包启动
   注意:打jar包一定要引入springboot的插件,否则打成的jar包无法执行。

三、springBoot配置

1. 父工程依赖版本管理

回忆maven中的父工程的作用:统一管理依赖和插件的版本

引入springBoot父工程:鼠标 Ctrl+左击 点进去
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
</parent>

发现其又继承父工程:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.11.RELEASE</version>
</parent>
<artifactId>spring-boot-starter-parent</artifactId>
<packaging>pom</packaging>
<name>spring-boot-starter-parent</name>

继续点进去,可看到依赖版本的声明:

 <properties>
    <activemq.version>5.15.15</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.88</appengine-sdk.version>
    <artemis.version>2.12.0</artemis.version>
    <aspectj.version>1.9.6</aspectj.version>
    <assertj.version>3.16.1</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <awaitility.version>4.0.3</awaitility.version>
    <bitronix.version>2.1.4</bitronix.version>
    <build-helper-maven-plugin.version>3.1.0</build-helper-maven-plugin.version>
     ...............
     ...............
</properties> 

springBoot的父工程中声明了很多依赖的版本,已经帮我们避免了依赖冲突的情况。

所以我们声明依赖时,只需要填写坐标,不需要依赖版本

例如:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
starter-web真实引入了我们web开发所需要的基本依赖。

image-20210612171108882

对于springBoot工程来说:
1.引入springBoot父工程,来声明依赖的版本
2.引入web工程需要的starter-web,引入依赖和相关的自动化配置类
3.引入springBoot工程的打包插件,用于后期的打包。
4.编写启动类,即可执行

2. 配置文件的分类

1.springBoot的配置有几种?
2.如果同时存在的会怎样?

配置文件的作用:

修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
SpringBoot官方讲解:约定 优于 配置 优于 编码

通过spring-boot-starter-parent依赖发现:

<resource>
    <directory>${basedir}/src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
        <include>**/application*.yml</include>
        <include>**/application*.yaml</include>
        <include>**/application*.properties</include>
    </includes>
</resource>

springBoot的配置分为yaml和properties:

基于上面开发入门代码演示:

1、在resources目录下新建 application.properties 配置文件,

添加端口号: 启动项目端口修改为 8088

server.port=8088
componey1=ahcfl

2、添加 application.yml配置文件

启动项目端口修改为 8090

server:
  port: 8090
componey2: cfl

3、修改controller,依赖注入读取配置信息:

package com.ahcfl.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @Value("${componey1}")
    private String componey1;
    @Value("${componey2}")
    private String componey2;

    @RequestMapping("/demo")
    public String demo(){
        return "hello springBoot--->"+componey1+" , "+componey2;
    }
}

启动,查看控制台启动日志:

image-20210612172559156

因此,浏览器访问 127.0.0.1/8088/demo

hello springBoot--->ahcfl , cfl

结论:

1. 约定 优于 配置 优于 编码两类配置文件如果同时存在,

2. 若 key 相同则 properties 优先级高,若key不同则合并

3. YAML配置文件基本使用

YAML 是 “YAML Ain’t Markup Language”的递归缩写 ,(YAML 不是一种标记语言)

SpringBoot默认读取的配置文件名称可以是application.properties或者application.yml,

其中application.yml采用一种完全不同与properties的语法风格。

基本语法:

1.大小写敏感
2.数据值前边必须有空格,作为分隔符
3.使用缩进表示层级关系
4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
5. # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

properties加载的优先级高于 yaml文件,避免冲突,可以将applicaiton.properties文件注掉或删掉

yml文件配置:

# 缩进表示层级
jdbc:
  username: root
  password: 123

# 对象(map集合)
person:
  name: zhangsan
# 或者行内写法
person1: {name: lisi}

# 数组或者集合
address:
  - beijing
  - shanghai

# 纯量,不可分割
msg1: 'hello \\n world' # 单引号忽略转义字符
msg2: "hello \\n world" # 双引号,识别转义字符

# 参数引用
name: ahcfl
person2: ${name} # 引用上面定义的参数值
package com.ahcfl.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("/yaml")
public class YamlBasicController {
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    //获取对象的值或者map的值
    @Value("${person.name}")
    private String name1;
    @Value("${person1.name}")
    private String name2;

    //获取数组的值
    @Value("${address[0]}")
    private String address1;

    //获取纯量:
    @Value("${msg1}")
    private String msg1;
    @Value("${msg1}")
    private String msg2;

    //参数引用
    @Value("${person2}")
    private String name3;

    @RequestMapping("/demo")
    public String demo(){
        System.out.println("数据库连接参数:"+username+":"+password);
        System.out.println("map或者对象值:"+name1+":"+name2);
        System.out.println("数组的值:"+address1);
        System.out.println("纯量值:msg1:"+msg1);
        System.out.println("纯量值:msg2:"+msg2);
        System.out.println("参数引用:"+name3);

        return "yaml基本使用";
    }
}

4. YAML配置文件自动装配到实体对象

1.编写yaml配置信息
2.定义实体类JdbcConfig和Person
3.给实体添加注解进行配置文件的读取
4.编写controller,依赖注入测试

yml文件配置:

# 对象(map集合)
person:
  name: ahcfl
  age: 20
  address:
    - beijing
    - shanghai
  jdbc:
    username: root
    password: 123
  daughter:
    name: jingtian
    age: 18
package com.ahcfl.pojo;

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

@Data
@ConfigurationProperties(prefix = "jdbc" ) //自动解析yaml前缀为jdbc的配置,并且自动进行依赖注入
@Component
public class JdbcConfig {
    private String username; // root 
    private String password; // 123
}
package com.ahcfl.pojo;

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

import java.util.Arrays;
import java.util.Map;

@Data
@ConfigurationProperties(prefix = "person")
@Component
public class Person {
    private String name;  // ahcfl
    private int age;      // 20
    private String[] address;
    private JdbcConfig jdbc;
    private Map<String,Object> daughter;  // jingtian:18
}

第二种配置方式:

@ConfigurationProperties(prefix=“xxx”)+@EnableConfigurationProperties(xxx.class)

此时就不需要在pojop配置类上加@Component,

给启动类添加注解@EnableConfigurationProperties(xxx.class)

package com.ahcfl.controller;

import com.ahcfl.pojo.JdbcConfig;
import com.ahcfl.pojo.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/yaml")
public class YamlSuperController {

    @Autowired
    private JdbcConfig jdbcConfig;

    @Autowired
    private Person person;

    @RequestMapping("/demo2")
    public String demo(){
        System.out.println("jdbc配置:"+jdbcConfig);
        System.out.println("人员信息:"+person);
        return "demo2";
    }
}

5. YAML配置文件之配置文件自动提示

image-20210612175029900

在springBoot的classpath中找不到该注解。在pom添加依赖配置:

<!--解决SpringBoot自定义配置提示问题-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

6. 配置文件切换

实际企业开发中,开发环境和生产环境连接的数据库是不同的,
所以我们需要不同的配置进行相互之间的切换。

步骤:
1.创建3个配置文件
	application.yml
	application-dev.yml
	application-prod.yml
2.dev和prod配置内容不一致	
3.application.yml中通过 spring.profiles.active=dev/prod 来激活指定配置

application-dev.yml

# 开发环境

# 对象(map集合)
person:
  name: zhangsan
  age: 20
  address:
    - beijing
    - shanghai
  jdbc:
    username: root
    password: 123
  daughter:
    name: lisi
    age: 18

application-prod.yml

# 对象(map集合)
person:
  name: zhangsan
  age: 20
  address:
    - beijing
    - shanghai
  jdbc:
    username: ahcfl
    password: 123
  daughter:
    name: lisi
    age: 18

application.yml中通过 spring.profiles.active=dev/prod 来激活指定配置

spring:
  profiles:
    active: dev

7. 项目内部配置文件的加载顺序

查看官网,可以看出给了17种方式的配置加载形式

按照官网说明,添加配置实现

优先级:由高到底

  • file:./config/:当前项目下的/config目录下
  • file:./ :当前项目的根目录
  • classpath:/config/:classpath的/config目录
  • classpath:/ :classpath的根目录

8. 项目外部配置(了解)

1.保证工程中一个application.yaml配置,打成jar包
2.命令行执行jar包,修改端口配置,访问项目
3.在e盘中创建application.yaml配置,通过jar命令指定配置执行jar包
4.再次运行,查看结果

image-20210612184529324

2.命令行执行jar包,修改端口配置,访问项目

java -jar app.jar --server.port=9000

浏览器访问:http://localhost:9000/demo

显示 classpath_zhangsan

3.在e盘中创建application.yaml配置,通过jar命令指定配置执行jar包

jdbc.username=classpath_lisi<

以上是关于springBoot快速开发+配置使用+整合mvcjunitdtuidmybatisredis的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源配置 MyBatis事务控制druid 监控)

springBoot整合ecache缓存

Spring是什么

Spring Boot快速搭建

SpringBoot 介绍快速入门配置文件整合其他框架

SpringBoot快速入门