关于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 报错问题

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理