Spring总结

  • Post author:
  • Post category:其他


1, Spring容器如何理解


IOC: 控制反转

具体含义: 将对象创建的权利交给Spring容器管理.

原因: 如果将对象自己管理,则必然出现耦合性高的现象. 不方便扩展

容器: 是一种数据结构类型 Map<K,V>集合

KEY: 类名首字母小写

Value: Spring为当前的类创建的对象.

只要程序启动成功,则Map集合中(容器),里边包含了所有的IOC管理的对象

2, Spring容器管理对象用法

@Component注解说明

表示: 表示将User对象交给Spring容器管理

类似于: new User();

问题: 如果直接new User(), 其中的属性都为null.

需求: 准备User对象 id=100,name=“tomcat” age=18 sex=“男” 交给Spring容器管理!!!

注意事项: 在进行测试时 将@Component删除

@Bean注解

注解说明: @Bean注解是Spring 专门为管理

自定义对象

研发的注解.

用法区域: 在配置类文件中使用

@SpringBootTest

说明: SpringBoot为了测试方便专门开发了@SpringBootTest 主要的作用就是

启动Spring容器

3, JDBC缺点

  1. 代码比较繁琐,不方便记忆.

  2. 开发效率低

  3. JDBC操作数据库时 结果封装繁琐.

  4. JDBC 运行效率高,但是不便于编辑.

4,Mybatis框架

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

总结: MyBatis 是一款优秀的持久层框架,利用ORM思想实现了数据库持久化操作.

补充说明: 也有人把mybatis称之为半自动化的ORM映射框架

4-1,ORM思想

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。

关系映射:

1. 对象映射——-映射表

2. 对象中有属性——-表中有字段



总结: 以对象的方式操作数据库.


1.面向过程编程 C语言 亲力亲为

2.面向对象编程 C++ , java , python

3.面向接口编程 目的实现层级的解耦.

@Param注解说明

å¨è¿éæå¥å¾çæè¿°

5,关于Mybatis的注解开发说明

  1. 注解开发 只适用于 单表CURD操作. 多表操作一定出问题

  2. 如果设计到复杂标签时 where/set/foreach 等标签时,不可以使用注解.

  3. 所以应该熟练掌握xml映射文件的写法,注解开发只是辅助的作用.

6,Mybatis关联查询小结

  1. 什么时候使用resultMap

    4.1 字段名称与属性名称不一致.

    4.2 做关联查询 实现数据封装时使用.

  2. 查询用户信息  开启驼峰映射规则


    resultType:


    1.适用与单表查询,同时要求属性名称与字段相同.

    2.如果属性与字段满足驼峰命名规则,开启驼峰映射之后,

    可以使用resultType


    resultMap:


    1.如果字段不一致时使用

    2.多表关联查询时使用.

    3.如果开启了驼峰映射规则, 则自动映射的属性可以省略,最好标识主键

    4.如果使用驼峰规则映射时,需要映射封装对象时(一对一/一对多),默认条件下.驼峰规则失效.

    可以使用: autoMapping=”true” 要求开启驼峰映射.

    5.默认条件下 一对一,一对多不会自动完成驼峰规则映射.

    需要配置 autoMapping=”true”才能自动映射

  3. 子查询用法:

    5.1 select 开始二次查询

    5.2 column 将字段的值作为参数传递给子查询 子查询通过#{字段名称}动态接收.

7,Mybatis 缓存机制

如果有大量相同的请求查询数据库,则数据库需要执行多次重复的sql,那么并发压力高,查询效率低. 如果引入缓存机制,则可以极大的提升用户的查询的效率

å¨è¿éæå¥å¾çæè¿°

7-1,Mybatis 提供缓存机制

Mybatis中有2级缓存

一级缓存 SqlSession 在同一个sqlSession内部 执行多次查询 缓存有效. 一级缓存默认开启状态.

二级缓存 SqlSessionFactory级别. 利用同一个工厂,创建的不同的SqlSession 可以实现数据的共享(缓存机制). 二级缓存默认也是开启的.

8,代理方式介绍

JDK动态代理

特点:

1. 要求被代理者,必须有接口.

2. 默认条件下如果有接口,则使用JDK动态代理

CGLIB动态代理

特点:

1.不管被代理者是否有接口,都可以为其创建代理对象.

2. 代理对象是目标对象的子类. 继承关系.

结论:

1.Spring中如果有接口,默认使用JDK代理方式,如果没有接口,则默认使用CGLIB代理方式.

2.Spring5以后,自身接口对象创建代理对象时,使用cglib

9,SSM框架案例

框架关系图

å¨è¿éæå¥å¾çæè¿°

10,双向数据绑定的原理

设计模型: MVVM

模块说明:

1. M Model 代表数据. 大概率事件 代表 data中的数据.

2. VM ViewModel 视图模型层 在内部进行计算 在页面进行展现

3. V View 视图层 用户看到的页面展现效果.

å¨è¿éæå¥å¾çæè¿°

11,生命周期函数分类

第一类: 对象的初始化阶段

1. beforeCreate.

2. created

3.beforeMount

4.mounted

第二类: 数据修改阶段

1.beforeUpdate

2.updated

第三类: 对象的销毁阶段

1.beforeDestroy

2.destroyed

11-1, 初始化时知识点


1, beforeCreate


在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

解释: 创建了一个VUE的对象,只是还没有加载其中的属性.只是一个空对象.


2,created


在实例创建完成后被立即同步调用

解释: VUE对象开始填充数据. 表示配置完成.


3.beforeMount


在挂载开始之前被调用:相关的 render 函数首次被调用。

解释: 对象根据已经配置的内容,在指定的区域开始加载数据.(属性的值,保存到内存中)


4.mounted


实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了

解释: 在指定的区域中,渲染页面. (为页面填充数据), 页面初始化完成.

12, 远程调用

什么是跨域

说明: 浏览器解析Ajax时 要求浏览器的网址,与Ajax请求的网址,必须满足三要素.

要素:

1. 协议相同

2. 域名相同

3. 端口号相同

如果上述的三要素都满足,则叫同域访问, 如果三要素有一项不满足,则称为跨域访问.

13,密码加密

加密算法MD5

规则说明: MD5加密算法,只能由明文转化为密文. 不可以反向编译.

破解MD5加密算法:

å¨è¿éæå¥å¾çæè¿°

14,关于Session和Cookie说明


14-1, 业务需求说明


用户的请求是一次请求,一次响应. 当响应结束时,服务器返回的数据 也会销毁. 问题: 如果销毁了token 则认为用户没有登录.需要重复登录.

如何解决该问题: 应该持久化token信息.


14-2 Session


Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。

特点: Session总结

Session 称之为 会话控制 技术

Session生命周期, 会话结束 对象销毁.

Session的数据存储在内存中.

Session只可以临时存储数据.不能永久存储.


14-3 Cookie总结


Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 [1] 。

特点:

1. 类型: 小型文本文件.

2. 文件通常是加密的.

3. cookie 可以临时或者永久存储.


14-4 关于Cookie和Session说明


手机银行的登录信息? Session存储. 数据安全性高

腾讯视频会员登录信息? Cookie存储 1个月免密登录.

公司的财务系统登录信息? Session存储

购物系统的登录信息? Cookie存储.

15,node.js和vue脚手架的关系

  1. node.js 作用Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。

  2. VUE脚手架 是前端开发模拟后端设计的一种开发框架体系 xxx.vue

  3. VUE.js 是将javascript封装的高级渐进式的JS的

    框架

16,Spring事务管理

事务特性

  1. 原子性: 原子不可分割.事务处理要么同时成功,要么同时失败.

  2. 一致性: 多线程条件下,数据应该保持一致.

  3. 隔离性: 多线程条件下,操作数据时,操作是独立互不干扰.

  4. 持久性: 将数据最终处理之后,持久化到数据库中.

    谐音:日本名字 “原一隔持”

16-1, Spring控制事务

说明: Spring中提供了注解@Transactional 用来控制事务, 常见业务 增/删除/修改一般需要事务控制. 查询一般不用.

16-2, Spring控制事务策略

规则:

1. Spring中的事务注解 默认条件下只处理运行时异常.如果遇到检查异常(编译异常)事务控制没有效果.

2. 注解的属性控制

rollbackFor = IOException.class , 遇到某种异常实现事务的回滚

noRollbackFor = 遇到某种异常事务不回滚.

readOnly = true 该操作是只读的,不能修改. 公告/合同等

17,Spring 全局异常处理机制

说明:

1. 后端业务执行时,无法保证 业务运行不出错. 所以一般添加try-catch进行异常的捕获.

2. 捕获异常是为了按照特定的要求 返回用户可以识别的有效数据.

3. 如果添加了try-catch 则会对代码的可读性造成影响.

4. 如果通过try-catch控制异常,则所有的controller方法都必须添加, 导致代码繁琐.

18,Mybatis-Plus


MP介绍


MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

说明: 使用MP将不会影响mybatis的使用.


MP特性


无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 – Sequence),可自由配置,完美解决主键问题

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作


Mybatis 特点


Mybaits 是一个半自动化的ORM映射框架

1.结果集可以实现自动化的映射. 自动

2.Sql语句需要自己手动完成. 手动

如果设计到单表的操作,如果每次都手写,则特别的啰嗦. 所以想办法优化.



MP工作原理




实质: MP动态生成Sql语句.

铺垫:

1. insert into 表名(字段名…) value (属性值…)




工作原理:

1. 用户执行userMapper.insert(user); 操作

2. 根据UserMapper的接口找到父级BaseMapper.根据BaseMapper的接口查找泛型对象User.

3. 根据User.class 获取注解@TableName(“demo_user”),获取表名

4. 根据User.class 获取所有的属性,根据属性获取指定的注解@TableField(value = “name”),获取字段名称

5. 根据属性获取属性的值.之后动态拼接成Sql语句

6. 将生成的Sql交给Mybatis执行入库操作.

1. insert into demo_user(id,name,age,sex) value (null,xx,xx,xx)




MP使用特点: 根据其中不为null的属性进行业务操作!!!



19,实现商品图片上传

package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.FileNameMap;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService{

    private String localDirPath = "E:/project3/images";
    private String preUrl = "http://image.jt.com";

    //1.校验图片类型   xxx.jpg   校验后缀是否为jpg
    @Override
    public ImageVO upload(MultipartFile file) {

        //1.1 获取文件名称  abc.jpg
        String fileName = file.getOriginalFilename();
        //1.2 全部转化为小写字母
        fileName = fileName.toLowerCase();
        //1.3正则校验是否为图片类型
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
            //图片类型 不匹配  程序应该终止
            return null;
        }

        //2.校验是否为恶意程序 怎么判断就是一张图 高度和宽度
        //2.1 通过图片对象进行处理
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();
            if(height == 0 || width == 0){
                return null;
            }
            //3.将图片分目录存储 yyyy/MM/dd
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                                .format(new Date());
            String dateDirPath = localDirPath + dateDir;
            File dirFile = new File(dateDirPath);
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //4.防止文件重名  动态生成UUID.类型
            //4.1 动态生成UUID
            String uuid = UUID.randomUUID().toString()
                              .replace("-","");
            //4.2 获取图片类型        abc.jpg    .jpg
            String fileType = fileName.substring(fileName.lastIndexOf("."));
            // uuid.jpg
            String newFileName = uuid + fileType;

            //5.实现文件上传 1.准备全文件路径  2. 封装对象实现上传
            String path = dateDirPath + newFileName;
            file.transferTo(new File(path));

            //6. 实现ImageVO数据的返回
            //6.1 准备虚拟路径 /2021/11/11/uuid.jpg
            String virtualPath = dateDir + newFileName;
            //6.2 准备URL地址  域名前缀 + 虚拟路径
            String url =  preUrl + virtualPath;
            System.out.println(url);
            return new ImageVO(virtualPath,url,newFileName);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public void deleteFile(String virtualPath) {
        String filePath = localDirPath + virtualPath;
        File file = new File(filePath);
        if(file.exists()){ //如果文件存在,则删除数据
            file.delete();
        }
    }
}

20,Nginx


Nginx介绍


Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。


Nginx-特点


占用内存少 不超过2M tomcat服务器占用内存 200M

并发能力强 3-5万次/秒 tomcat 支持的并发能力 220-260个/秒 调优1000个/秒

开发语言 C语言开发 tomcat是java写的

知识点:

1. 并发能力: 多个用户同时访问服务器.

2. 并行 计算机中的一种处理方式.


Nginx-代理


问题描述

需求: 图片需要进行回显 难题: 网络地址需要与物理地址进行映射

网络地址: http://image.jt.com/2021/11/16/64e19fa13e474ecca28d64e85b0a9312.jpg

物理地址: E:\project3\images\2021\11\16/64e19fa13e474ecca28d64e85b0a9312.jpg

问题1: 能否将物理地址传给用户,用户通过物理地址直接访问!!! 不可以

图片获取的步骤:

1. 用户通过网络地址访问服务器: http://image.jt.com/2021/11/16/64e19fa13e474ecca28d64e85b0a9312.jpg

2. 通过某种机制,将域名动态转化为本地磁盘地址.http://image.jt.com转换为E:\project3\images

3. 根据磁盘地址信息.找到图片 回传给用户,即用户可以查看到图片.


反向代理(nginx)


反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

特点:

1. 反向代理服务器介于用户和目标服务器之间

2. 用户的资源从反向代理服务器中获取.

3. 用户不清楚真实的服务器到底是谁. 保护了服务器的信息. 称之为服务器端代理.

å¨è¿éæå¥å¾çæè¿°


正向代理(扩展)


正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

特点:

1. 反向代理服务器介于用户和目标服务器之间

2. 用户的资源从正向代理服务器中获取.

3. 客户端通过正向代理服务器,指向目标服务器.(用户非常清楚的了解目标服务器的存在.) 服务器端不清楚到底是谁访问的服务器.以为只是代理服务器访问.

å¨è¿éæå¥å¾çæè¿°


关于正向和反向说明

说明: 每一次请求服务器,都伴随着正向代理和反向代理.


正向主要提供网络服务, 反向主要提供数据支持

.

å¨è¿éæå¥å¾çæè¿°

21,Nginx负载均衡

å¨è¿éæå¥å¾çæè¿°

负载均衡配置

轮询策略

说明: 根据配置文件中的服务器的顺序,依次访问服务器.

权重策略

说明: 根据服务器的性能,灵活的进行访问的配比

IPHASH策略

说明: 如果需要用户与tomcat服务器进行绑定. 可以选用 iphash策略

策略: 有时会将用户的数据,存储到后端服务器的Session中.并且保证每次用户访问都访问同一个tomcat服务器.

iphash实现原理:

å¨è¿éæå¥å¾çæè¿°



版权声明:本文为weixin_49143405原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。