乐趣区

关于springboot:分布式一SpringBoot配置原理

Maven 工具高级用法

阐明: maven 中 如果 A—–>B——–>C 那么在我的项目中引入 A 包, 就能够主动的引入 BC!!! 如何实现的???

Maven 工具解析原理:
1). 用户通过 dependency 标签依赖 jar 包时,maven 工具会通过坐标去本地仓库中查找改 jar 包文件.

2). maven 查找 jar 包文件之后, 解析以后 jar 包的 POM.xml 文件, 引入相干依赖.

原理阐明:

  1. 当通过 pom.xml 文件增加依赖项时,maven 工具会通过坐标查找 jar 包文件.
  2. 当加载 jar 包实现之后, 会解析以后的 POM.xml 文件, 如果其中还有 jar 包的依赖项吗, 则再次解析加载 jar 包. 最终实现 jar 包传递性的实现

maven 中 jar 包传输准则

问题:jar 包文件 如何保障在近程传输的过程中不被他人篡改???
算法介绍: SHA1 算法

SHA-1(英语:Secure Hash Algorithm 1,中文名:平安散列算法 1)是一种明码散列函数 ,美国国家安全局设计,并由美国国家标准技术研究所(NIST)公布为联邦数据处理规范(FIPS)。SHA- 1 能够生成一个被称为 音讯摘要 的 160 位(20 字节)散列值,散列值通常的出现模式为40 个十六进制数

SpringBoot 配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <!--
      Maven:Maven 是一站式的项目管理工具,负责我的项目的构建 / 打包 / 测试 / 公布等工作。知识点一:理解坐标的的作用
      maven 我的项目标识 组 id/ 项目名称 / 版本号 称之为 maven 的坐标
      1.maven 中治理的 jar 包文件泛滥 如何无效的治理呢?采纳坐标的模式
      2. 在本地的仓库中 jar 包地位就是坐标的地位,maven 工作通过坐标查找执行的 jar

      知识点二:maven 中的 jar 包文件具备依赖的传递性
      例子:A.jar ~~~ B.jar ~~~ C.jar ~~~ D.jar
      maven。jar 包的传递性如何实现?当通过 pom.xml 文件增加依赖时,maven 会依据坐标查找 jar 包文件。当加载 jar 包实现之后,会解析以后的 pom.xml 文件,如果其中还有 jar 包的依赖项,则再次解析加载 jar 包
      最终实现 jar 包的传递性
   -->
   <groupId>com.jt</groupId>
   <artifactId>springboot_demo1</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>springboot_demo1</name>
   <description>Demo project for Spring Boot</description>

   <!--
      作用:1.parent 标签 集中定义了 springboot 所有依赖 jar 包的版本信息(version), 由官网解决了 jar 包冲突性问题
         2. 本地仓库中没有该文件的 jar 包,parent 示意的是一个聚合工程(定义:大工程下蕴含许多小工程)-->
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.4.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

      <!--maven 我的项目的配置信息 -->
   <properties>
      <!-- 指定了 jdk 版本信息 -->
      <java.version>1.8</java.version>
      <!-- 跳过测试类运行 默认状况下程序打包会执行测试类,如果测试类有问题,则程序打包失败 -->
      <skipTests>true</skipTests>
   </properties>

   <dependencies>
      <!--
         手动依赖项 该依赖项被 springBoot 进行了高度整合
         springBoot 帮忙大家动静的生成了配置我的项目,简化了配置的步骤,该配置称之为自动化的配置信息
         spring-boot-starter springBoot 自动化的启动项
         开箱即用:只须要导入 jar 包简略的配置即可实现对应的性能
      -->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
         <exclusions>
            <exclusion>
               <groupId>org.junit.vintage</groupId>
               <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
         </exclusions>
      </dependency>


      <!-- 反对热部署 -->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
      </dependency>

   </dependencies>

   <!--SpringBoot 利用 maven 管理工具进行我的项目打包 / 公布 / 等操作 -->
   <!-- 如果没有这个 build 标签,咱们打包公布时会提醒(jar 中没有主清单属性)-->
   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>
对于 Maven 命令执行

1. 清空 target 文件
2. 编译我的项目
3. 我的项目打包操作

打成 jar 包的我的项目使用 dos 命令公布

java -jar xxx.jar

SpringBoot 主启动类阐明

问题阐明: 为什么指定了主启动类的形式 tomcat 服务器能够主动的运行, 并且 SpringMVC 的框架能够主动的配置?

对于元注解的阐明
1.@Target(ElementType.TYPE) 标识注解对谁无效. 该注解示意对类无效.
2.@Retention(RetentionPolicy.RUNTIME) 标识注解的有效期 在运行时无效. 个别都写 runtime
3.@Documented 动静生成文档文件.
4.@Inherited 是否容许子注解继承该注解.

@SpringBootConfiguration 阐明

作用: 标识主启动类是一个大型的配置文件, 启动时会加载所有的小的配置文件.

@Configuration

示意该类是一个配置类.

excludeFilters 属性阐明

阐明: 在 springboot 容器启动时, 不须要加载某些过滤器. 因为 parent 标签中定义了所有的关联的 jar 包文件信息. 则启动时有可能导致意外的产生, 所有须要提前剔除.
例子:

@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
// 示意不加载数据库驱动依赖配置

@EnableAutoConfiguration

开箱即用: 只有导入指定的 jar 包文件, 则能够主动的实现配置!!!

@AutoConfigurationPackage

阐明: 当程序启动时, 会依据主启动类的包门路, 扫描其子孙包, 所以 springboot 当前写代码时应该在其子孙包下编辑.

@Import(AutoConfigurationImportSelector)

阐明: 该配置中外部集成了所有的 SpringBoot 中的选择器. 这些选择器的次要的工作就是查看是否有本人选择器所治理的启动项的配置. 如果发现该启动项, 那么选择器就会执行该启动项, 从而实现了开箱即用的操作.

加载第三方的类信息

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),

@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

SpringBoot 配置文件的阐明

properties 阐明

1. 语法: k- v 构造 key=value
2. 数据类型: 默认是 String 数据类型 不要增加多余的 ”” 号
3. 字符数据类型: properties 的默认的加载的编码格局为 ISO-8859-1 所以增加中文是须要字符转意.
4. 毛病: 所有的 key 都必须手动的编辑 没有方法复用 所以引入了 yml 配置

YML 配置文件阐明

1. 语法 K- V 构造 写法上 key:value 本质上 key=value
key:value 两头应用 (:+ 空格) 分隔
key 与 key 之间有父子级关系的. 所以写的时候留神缩进项.
YML 配置文件默认的格局都是 UTF- 8 编码 所以能够间接编辑中文

对于 SpringMVC 调用流程

1. 前端控制器 所有申请的中转站
2. 处理器映射器 将用户的申请与执行的业务办法进行映射(绑定)
3. 处理器适配器
4. 视图解析器

对于配置文件赋值操作

@Value 注解属性赋值

需要: 有时对象中的属性的值可能会发生变化, 如果间接写死到代码中可能导致耦合性高. 是否利用配置文件形式动静的为属性赋值.

编辑 YML 配置文件

# 语法:   1. key-value 构造     2.key 和 value 之间应用:(空格)进行宰割 
#         2.YML 配置文件有层级构造
server:
  port: 8090
  servlet:
    context-path: / #我的项目公布门路信息 默认条件下 / 根目录
    # tomcat 服务器进行公布 默认公布门路地址 webapps 目录下    
    # /     ROOT 我的项目门路
    # /jt   JT   我的项目门路
    
#指定用户配置文件信息
msg:
  username: 许三多
  age: 10 

利用注解取值

 @RestController
public class MsgController {
    
    // 有时可能会通过配置文件的模式为属性动静的赋值.
    
    /**
     * @Value 示意从 spring 容器中动静获取数据.
     * 通过 spel 表达式动静取值
     */
    @Value("${msg.username}")
    private String  username;    // 用户名
    @Value("${msg.age}")
    private Integer age;        // 年龄
    
    
    @RequestMapping("/getMsg")
    public String getMsg() {return "返回值后果:"+username+":"+age;}
    
}

批量为属性赋值

需要阐明

因为 springBoot 整合第三方框架时, 可能会遇到多个属性赋值的问题. 如果通过 @Value 的形式赋值, 则代码比拟繁琐. 是否优化???

导入 jar 包

 `<!-- 增加属性注入依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>` 

实现属性赋值

package com.jt.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@ConfigurationProperties(prefix = "msg")
public class MsgController {
    
    // 有时可能会通过配置文件的模式为属性动静的赋值.
    /**
     * 批量为属性赋值, 必须配合 set 办法能力赋值
     */
    private String  username;    // 用户名
    private Integer age;    
    
    
    public String getUsername() {return username;}

    public void setUsername(String username) {this.username = username;}

    public Integer getAge() {return age;}

    public void setAge(Integer age) {this.age = age;}

    @RequestMapping("/getMsg")
    public String getMsg() {return "返回值后果:"+username+":"+age;}
    
}

利用 properties 文件为属性赋值

阐明: 因为 YML 配置文件个别都是配置第三方的整合的信息, 如果将业务的数据增加到 YML 中则不标准. 最好将业务的操作增加到 properties 文件中.

增加配置文件:

编辑 RedisPro 配置文件:
@RestController
// 须要通过 spring 容器加载配置文件, 并且以 utf- 8 的格局进行加载
@PropertySource(value="classpath:/properties/redis.properties",encoding = "UTF-8")
public class RedisProController {@Value("${redis.pro.host}")
    private String proHost;
    @Value("${redis.pro.port}")
    private Integer proPort;

    @RequestMapping("/getMsgPro")
    public String getMsg2(){return proHost + ":" + proPort;}

}

SpringBoot 环境切换问题

业务需要

业务场景:
员工是外包人员, 经常性的须要往返公司和甲方, 进行代码调试时因为地位不同所以服务器 IP 地址必然不同. 如果每次换环境都必须从新编辑 IP 地址和端口等数据, 必然繁琐是否优化??

业务实现 - 指定多个环境

注意事项: 无论什么样的环境, 配置的个数都是雷同的, 只有值不同…

# 该配置文件, 当 spring 容器启动时加载.
spring:
  profiles:
    active: prod
---

# 定义开发环境
spring:
  profiles: dev

server:
  port: 8080

#配置 redis 节点信息
redis:
  host: 192.168.1.100
  port: 6379

# 如果须要多环境配置则须要将 YML 环境宰割
---
spring:
  profiles: prod

server:
  port: 8090

#配置 redis 节点信息
redis:
  host: 10.0.0.1
  port: 6379

增加热部署配置

1. 增加 jar 包文件

 `<!-- 反对热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>` 
  1. 配置 IDEA 工具

组合键: ctrl + shift + alt + /

开启主动编译即可:

编辑 POJO

对于 LOMBOK 面试题

问题: java 我的项目开发实现之后须要在 Linux 零碎中部署我的项目. 问题:Linux 环境中是否须要独自装置 LomBok 插件???
考点: LOMBOK 插件工作原理是否分明…
A: 要 B: 不须要
答案:B
解析: LOMBOK 插件编译器无效 xxx.java 文件 —- 编译 —–xxx.class 动静的生成 set/get/toString 等办法增加到.class 文件中即可. Linux 中运行的 jar 包是.class 文件的汇合 曾经有了 get/set 办法. 所以不须要引入插件.

重点看看链式加载构造的原理

@Data   // 动静生成 get/set/toString/equals 等办法
@Accessors(chain = true)    // 开启链式加载构造
@NoArgsConstructor// 无参结构
@AllArgsConstructor// 全参结构  增加全参结构时必须增加无参结构
public class User implements Serializable {
    private static final long serialVersionUID = -3205763327437547534L;
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
// 链式接在构造原理,返回值为 this 对象
// 应用时 user.setName("ssss").setId(100).setAge(100);
//    public User setId(Integer id){
//        this.id=id;
//        return this;
//    }
}

对于 Sql 连贯阐明

1.serverTimezone=GMT%2B8 %2B 代表 “+” 号 示意时区
2.useUnicode=true&characterEncoding=utf8 指定编码为 utf-8
3.autoReconnect=true& 如果程序连贯数据库中途断掉时是否重连.
4.allowMultiQueries=true 是否容许批量操作
eg: 要求一次入库 3 张表数据… 要求用一行 sql 实现该操作

编辑 YML 配置文件

server:
  port: 80
  servlet:
    context-path: /
spring:
  datasource:
    #驱动版本问题 高版本须要增加 jc 关键字 个别能够省略
    #driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: 1234


mybatis:
  #别名包的定义,定义了 Mapper 中 resultType 的包名,咱们只须要写类名主动拼接即可
  type-aliases-package: com.jt.pojo
  #加载指定的 xml 映射文件
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射,详情在 XML 文件中
  configuration:
    map-underscore-to-camel-case: true

编辑 UserMapper 映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.mapper.UserMapper">
   
   <select id="findAll" resultType="User">
      select * from user
   </select>


   <!-- 开启驼峰映射
      业务需要:
         要求实现数据库的查问,然而数据库字段与对象的属性不统一,eg:
         user 表(字段 user_id,user_name,user_age......)
         User 对象(属性 userId,userName,userAge......)
      阐明:引入驼峰映射的规定,解决下划线问题
      执行程序:获取 user_id~~~ 去掉多余的下划线 "_" 字母大写~~~~userId(实现数据的映射)注意事项:如果应用规定,必须满足标准,否则映射不到。-->
</mapper>

对于 AutoWired 报错问题

退出移动版