1

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.项目打包操作
20201028153642935.png

打成jar包的项目运用dos命令发布

java -jar xxx.jar

SpringBoot主启动类说明

问题说明: 为什么指定了主启动类的方式 tomcat服务器可以自动的运行,并且SpringMVC的框架可以自动的配置?

关于元注解的说明
1.@Target(ElementType.TYPE) 标识注解对谁有效. 该注解表示对类有效.
2.@Retention(RetentionPolicy.RUNTIME) 标识注解的有效期 在运行时有效. 一般都写runtime
3.@Documented 动态生成文档文件.
4.@Inherited 是否允许子注解继承该注解.
20201028172720112.png

@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.视图解析器
20201029111644750.png

关于配置文件赋值操作

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

在这里插入图片描述


禾白少二
57 声望26 粉丝