当前位置 博文首页 > 努力充实,远方可期:【springboot】1、基础

    努力充实,远方可期:【springboot】1、基础

    作者:[db:作者] 时间:2021-08-11 09:58

    **一、**Spring Boot 入门

    1.1、Spring Boot 简介

    简化Spring应用开发的一个框架;

    整个Spring技术栈的一个大整合;

    J2EE开发的一站式解决方案;

    1.2、微服务

    2014,martin fowler

    微服务:架构风格(服务微化)

    一个应用应该是一组小型服务的组合;可以通过HTTP的方式进行互通;

    • 单体应用:ALL IN ONE
    • 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;

    详细参照微服务文档

    1.3、MAVEN准备

    http://www.gulixueyuan.com/ 谷粒学院

    环境约束

    –jdk1.8:Spring Boot 推荐jdk1.7及以上;java version “1.8.0_112”

    –maven3.x:maven 3.3以上版本;Apache Maven 3.3.9

    –IntelliJIDEA2017:IntelliJ IDEA 2017.2.2 x64、STS

    –SpringBoot 1.5.9.RELEASE:1.5.9;

    1.3.1、MAVEN设置;

    给maven 的settings.xml配置文件的profiles标签添加(指定maven用jdk1.8运行项目)

    <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>
    

    1.3.2、IDEA设置

    整合maven进来;打开IDEA的settings,选择Build Execution Deployment/Maven/下面的version版本选择对应的版本

    1.4、HelloWorld

    实现功能:浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;

    1.4.1、创建一个maven工程;(jar)

    1.4.2、pom依赖

    导入spring boot相关的依赖

    Spring Boot的版本仲裁中心;
    依赖管理    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    
    他的父项目
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制
    
    以后我们导入依赖默认是不需要写版本;
    默认里没有的依赖我们再自己去手动导入
    1、引入依赖默认都可以不写版本
    2、引入非版本仲裁的jar,要写版本号
    
    ? 可以修改默认版本号
    1、查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。
    2、在当前项目里面重写配置
        <properties>
            <mysql.version>5.1.43</mysql.version>
        </properties>
    
    <!--
    spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;如tomcat、hibernate、spring-webmvc-jackson-databind、spring-web。
    1、见到很多 spring-boot-starter-* : *就某种场景
    2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
    3、SpringBoot所有支持的场景
    https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter
    4、见到的  *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。
    5、所有场景启动器最底层的依赖
    
    Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
    -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
    maven-plugin打包
    <!-- 在pom.xml中导入:这个插件,可以将应用打包成一个可执行的jar包;
    将这个应用打成jar包,直接使用java -jar的命令进行执行;
    点击 右侧maven Project/项目名/package,mvn -f 项目名 clean package
    就生成了一个jar包。拿jdk运行就行
    java -jar XXX.jar
    -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

    1.4.3、配置类

    启动Spring Boot应用

    //@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
    @SpringBootApplication
    public class HelloWorldMainApplication {
    
        public static void main(String[] args) {
            // Spring应用启动起来
            SpringApplication.run(HelloWorldMainApplication.class,args);
        }
    }
    

    ①热部署

    在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊。在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。下面我们就看看对于简单的类修改的热部署怎么实现。

    <!--SpringBoot热部署配置 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    
    #"关闭缓存, 即时刷新"
    #spring.freemarker.cache=false
    #spring.thymeleaf.cache=true  如果开启此处会导致每次输入删除都会自动刷新哪怕你没保存
     
    #热部署生效
    spring.devtools.restart.enabled=true
    #设置重启的目录,添加那个目录的文件需要restart
    spring.devtools.restart.additional-paths=src/main/java
     
    spring.devtools.restart.exclude=WEB-INF/**
    
    • (1) devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),
      实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署
      即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的
    • (2)配置了true后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。

    默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。

    1 原理

    深层原理是使用了两个ClassLoader

    • 一个Classloader加载那些不会改变的类(第三方Jar包),Base classloader
    • 一个ClassLoader加载会更改的类,称为restart ClassLoader

    这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

    Base classloader加载不变的,如引入的包,restart classloader重新加载我们的代码

    所以并不是重启全部

    2 devtools工具包

    Pom: Spring boot devtools依赖

    devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),

    这个意思是说得编译后才重启。Ctrl+F9

    java类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。

    devtools可以实现页面热部署(页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现,后面讲到)。

    3 idea的工具设置

    当我们修改了类文件后,idea不会自动编译,需要通过ctrl+F9来触发,

    如果想要自动生效得修改idea设置,该功能按着个人的喜好来设置,修改类后,当我们窗口切换时候可以看到热部署的发生

    (1)File-Settings-Compiler-Build Project automatically

    (2)ctrl + shift + alt + / ,选择Registry,勾上 Compiler autoMake allow when app running

    并不是没改一个字就重启,而是切换窗口才重启

    4 热部署的排除

    默认情况下,/META-INF/maven/META-INF/resources/resources/static/templates/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。

    \1. 我们在resources/static目录下创建tx.js文件每次发生修改后的并不重启,而是采用liveReload的方式。

    \2. 同时我们可以根据自己的意愿来设置想要排除的资源

    spring.devtools.restart.exclude=static/**,public/**
    

    ②configuration-processor

    我们可以导入配置文件处理器,以后编写配置就有提示了

    <!--导入配置文件处理器,配置文件进行绑定就会有提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    properites的编码问题:properties配置文件在idea中默认utf-8可能会乱码,而properties使用的是ASCII

    ③Lombok

    简化JavaBean开发

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    
    idea中搜索安装lombok插件,安装
    
    ===============================简化JavaBean开发===================================
    @NoArgsConstructor
    //@AllArgsConstructor
    @Data
    @ToString
    @EqualsAndHashCode
    public class User {
        private String name;
        private Integer age;
        private Pet pet;
    
        public User(String name,Integer age){
            this.name = name;
            this.age = age;
        }
    }
    ================================简化日志开发========================