Spring Framework系统框架
学习内容
核心容器:IOC, DI
整合:整合数据层技术MyBatis
AOP
事务
核心概念IoC 控制反转
使用对象时,由主动new出生对象转换为由==外部==提供对象,此过程中对象创建控制权由程序转移到==外部==,此思想称为控制反转。
IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中称为==bean==
DI(Dependency Injection)依赖注入在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
beanbean配置
bean基础配置
bean别名配置
bean作用范围配置
适合交给容器进行管理的bean–表现层对象,业务层对象,数据层对象,工具对象
不适合的–封装实体的域对象。
bean实例化
bean本质上就是对象,创建bean使用构造方法完成。(==常用==)
...
Java
未读简介入门
创建新模块,选择spring初始化,并配置模块相关基础信息
选择当前模块需要使用的技术集
运行控制器类
运行自动生成的Application类
项目快速启动
对SpringBoot项目打包(执行Maven构建指令package)
执行启动指令
java -jar springboot项目名.jar
概述
起步依赖
SpringBoot程序启动
启动方式
SpringBoot在创建项目时,采用jar的打包方式
SpringBoot的引导类是项目的入口,运行main方法就可以启动项目。
基础配置配置文件格式
修改服务器端口
配置格式: SpringBoot配置文件加载顺序:properties > yml > yaml
yaml语法规则
yaml读取
使用@Value读取单个数据,属性名引用方式: ${一级属性名.二级属性名}
封装全部数据到Environment对象
自定义对象指定数据(常用)
自定义对象封装数据警告解决方案
多环境启动
yaml配置文件
prope ...
Java
未读认识微服务单体架构
单体架构:将业务的所有功能集中在一个项目开发,打一个包部署
优势: 架构简单,部署成本低
缺点
团队协作成本高
系统发布效率低
系统可用性差
总结:单体架构适合开发功能相对简单,规模较小的项目
微服务
微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:
单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。
团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人(2张披萨能喂饱)
服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响
例如,黑马商城项目,我们就可以把商品、用户、购物车、交易等模块拆分,交给不同的团队去开发,并独立部署:
那么,单体架构存在的问题有没有解决呢?
团队协作成本高?
由于服务拆分,每个服务代码量大大减少,参与开发的后台人员在1~3名,协作成本大大降低
系统发布效率低?
每个服务都是独立部署,当有某个服务有代码变更时,只需要打包部署该服务即可
...
Java
未读快速入门
介绍
springsecurity是安全框架,准确来说是安全管理框架。相比与另外一个安全框架Shiro,springsecurity提供了更丰富的功能,社区资源也比Shiro丰富
springsecurity框架用于Web应用的需要进行认证和授权
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权:经过认证后判断当前用户是否有权限进行某个操作。认证和授权也是SpringSecurity作为安全框架的核心功能
认证和授权也是SpringSecurity作为安全框架的核心功能
认证
springsecurity的权限管理,是先认证后授权,所以我们先学习认证这一部分流程图如下,注意下图的jwt指的是 json web token,jwt是登录校验的时候用的技术,可以根据指定的算法进行信息的加密和解密
springsecurity原理
SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。例如快速入门案例里面使用到的三种过滤器,如下图 (监听器 -> 过滤器链 -> dispatcherservl ...
Java
未读
MybatisPlus不仅仅可以简化单表操作,而且还对Mybatis的功能有很多的增强。可以让我们的开发更加的简单,高效。
目标:
能利用MybatisPlus实现基本的CRUD
会使用条件构建造器构建查询和更新语句
会使用MybatisPlus中的常用注解
会使用MybatisPlus处理枚举、JSON类型字段
会使用MybatisPlus实现分页
1.快速入门为了方便测试,我们先创建一个新的项目,并准备一些基础数据。
1.1环境准备
最后,在application.yaml中修改jdbc参数为你自己的数据库参数:
1234567891011spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: M ...
MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
mybatis入门lombok
是一个实用的java类库,能通过注解的形式自动生成构造器,getter、setter、equals、toString等方法,并可以自动化生成日志变量,简化java开发,提高效率。
mybatis对数据库的增删改查
根据主键删除
预编译SQL:性能更高,更安全(防止SQL注入)
新增
主键返回:在事件添加成功后,需要获取插入数据库事件的主键。
更新
查询(根据ID查询)
数据封装
实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
XML映射文件
多参数
@Param注解(命名参数)
可以不用arg0 arg1 param1 param2吗?这个map集合的key我们自定义可以吗?当然可以。使用@Param注解即可。这样可以增强可读性。
需求:根据name和age查询
StudentMapper接口
1234567/** * 根据name和age查询 * @para ...
开发环境搭建
使用create-react-app快速搭建开发环境,创建react开发环境的工具,底层由webpack构建,封装了配置细节,开箱即用:
执行命令:
npx create-react-app react-basic
npx node.js工具命令,查找并执行后续命令
create-react-app 核心包(固定写法),用于创建React项目
react-basic React项目的名称(可以自定义)
index.js
1234567891011121314// 导入React库,用于构建用户界面import React from 'react';// 导入ReactDOM库,用于将React组件渲染到Web页面中import ReactDOM from 'react-dom/client';// 导入App组件,该组件是应用的主要入口点import App from "./App";// 使用ReactDOM创建一个根DOM元素,与HTML中的root元素对应const root = ReactDOM.c ...
Vue2安装Axios:npm install axios --save --legacy-peer-deps
vue的概念
Vue是一个用于构建用户界面的渐进式框架
vue的两种使用方式
Vue核心包开发:场景–局部模块构造
Vue核心包&Vue插件工程化开发:场景–整站开发
创建Vue实例初始化渲染
核心步骤4步
准备容器
引包
创建Vue实例 new Vue()
指定配置项 -> 渲染数据
el 指定挂载点
data 提供数据
插值表达式
插值表达式{{}}
作用:利用表达式进行插值,渲染到页面中
表达式:是可以被求值的代码,JS引擎将其JS出一个结果
语法:{{表达式}}
注意点
使用的事件必须存在
支持表达式,而非语句,比如:if for …
不能在标签属性中使用插值表达式
vue核心特性:响应式
响应式:数据变化,视图自动更新
如何访问或修改数据?
data中的数据,最终会被添加到实例上
访问数据: “实例.属性名”
修改数据:”实例.属性名” & ...
ES6
ECMAScript(ES)是规范,JavaScript是ES的实现。
ES6的第一个版本在2015年6月发布,正式名称《ECMAScript2015标准》(简称ES2015)
ES6指的是5.1版本以后的JavaScript的下一代标椎,涵盖了ES2015.ES2016.ES2017等等。
let关键字越域推荐使用let关键字替代 var关键字声明变量,因为 var存在诸多问题,比如:
123456{ var a = 1; let b = 2;}console.log(a); // 1console.log(b); // ReferenceError: b is not defined
重复声明12345678// var 可以声明多次// let 只能声明一次var m = 1var m = 2let n = 3// let n = 4console.log(m) // 2console.log(n) // Identifier 'n' has already been declared
变量提升123456// ...
Java
未读
微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们成这种调用方式为同步调用,也可以叫同步通讯。但在很多场景下,我们可能需要采用异步通讯的方式,为什么呢?
我们先来看看什么是同步通讯和异步通讯。如图:
解读:
同步通讯:就如同打视频电话,双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。
异步通讯:就如同发微信聊天,双方的交互不是实时的,你不需要立刻给对方回应。因此你可以多线操作,同时跟多人聊天。
两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发微信可以同时与多个人收发微信,但是往往响应会有延迟。
所以,如果我们的业务需要实时得到服务提供方的响应,则应该选择同步通讯(同步调用)。而如果我们追求更高的效率,并且不需要实时响应,则应该选择异步通讯(异步调用)。
同步调用的方式我们已经学过了,之前的OpenFeign调用就是。但是:
异步调用又该如何实现? ...