Web后端开发

目录

目录

一、Maven

1、Maven

2、IDEA导入Maven项目

3、依赖管理

4、生命周期

二、SpringBootWeb

1、SpringBootWeb快速入门

2、HTTP协议

3、Tomcat

4、请求

5、响应

6、分层解耦

三、数据库

1、数据库

2、MyBatis

四、SpringBootWeb案例中用到的部分知识总结

1、开发中遇到的知识点

2、事物管理


一、Maven

1、Maven

1)Maven是一款用于管理和构建java项目的工具。

2)Maven的作用:依赖管理、统一项目结构和项目构建;

依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题;

统一项目结构:提供标准、统一的项目结构;

项目构建:标准跨平台的自动化项目构建方式。

3)仓库:用于存储资源,管理各种jar包

本地仓库:自己计算机上的一个目录;

中央仓库:有Maven团队维护的全球唯一的;

远程仓库(私服):一般由公司团队搭建的私有仓库。

4)Maven坐标:资源的唯一标识,通过该坐标可以唯一定位资源位置;

使用坐标来定义项目或引入项目中需要的依赖;

Maven坐标主要组成:groupId、artifactId、version;

groupId:定义当前Maven项目隶属组织名称(通常是域名反写);

artifactId:定义当前Maven项目名称;

version:定义当前项目版本号。

2、IDEA导入Maven项目

1)方式一:打开IDEA,选择右侧Maven面板,点 + 号,选中对应项目的pom.xml文件;

2)方式二:

3、依赖管理

1)依赖:当前项目运行所需要的jar包,一个项目中可以引入多个依赖;

配置:在pom.xml中编写<dependencies>标签;

在<dependencies>标签中使用<dependency>引入坐标;

定义坐标的groupId、artifactId、version;

点击刷新按钮,引入最新加入的坐标。

2)依赖具有传递性

直接依赖:在当前项目中通过依赖配置建立的依赖关系;

间接依赖:被依赖的资源如果依赖其它资源,当前项目间接依赖其它资源。

3)排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本,通过<exclusion>实现。

4)依赖范围

依赖的jar包,默认情况下,可以在任何地方使用,可以通过<scope>....<scope>设置其作用范围;

作用范围:主程序范围内有效、测试程序范围有效、是否参与打包运行;

4、生命周期

1)Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一;

Maven中有3套相互独立的生命周期:

clean:清理工作;

default:核心工作,如编译、测试、打包、安装、部署等;

site:生成报告、发布站点等。

2)每套生命周期包含一些阶段,阶段是有顺序的,后面的阶段依赖于前面的阶段;

生命周期阶段

clean:移除上一次构建生成的文件;

compile:编译项目源代码;

test:使用合适的单元测试框架运行测试;

package:将编译后的文件打包;

install:安装项目到本地仓库;

在同一套生命周期中,运行后面的阶段时,前面的阶段都会运行。

二、SpringBootWeb

1、SpringBootWeb快速入门

需求:使用SpringBoot开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串"Hello World~";

①.创建springboot工程,并勾选web开发相关依赖;

②.定义HelloController类,添加方法hello,并添加注解;

③.运行测试。

2、HTTP协议

1)HTTP(超文本传输协议):规定了浏览器和服务器之间数据传输的规则;

特点:基于TCP协议:面向连接,安全;

基于请求-响应模型的:一次请求对应一次响应;

HTTP协议是无状态的协议:对于事物处理没有记忆能力,每次请求-响应都是独立的;

缺点:多次请求间不能共享数据;

优点:速度快。

2)HTTP请求数据格式

3)HTTP响应格式

4)Web服务器

Web服务器对HTTP协议的操作进行封装,使程序员不必直接对协议进行操作。

3、Tomcat

1)Tomcat是一个开源免费的轻量级Web服务器,也被称为Web容器、Servlet容器;

Servlet程序需要依赖于Tomcat才能运行,基于Springboot开发的web应用程序,内置了tomcat服务器。

4、请求

1)请求:获取请求数据;

响应:设置响应数据;

BS架构:浏览器/服务器架构模式,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端;

CS架构:客户端/服务器架构模式。

2)Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件;

作用:常用于进行接口测试。

3)简单参数

原始方式:获取请求参数,通过HttpServletRequest对象手动获取;

SpringBoot方式:参数名与形参变量名相同,定义形参即可接收参数;

如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射;

@RequestParm中的required属性默认为true,代表该请求参数必须传递,不传递将报错,如果该参数是可选的,可以将required属性设置为false。

4)实体参数

简单实体对象:请求参数名与形参对象属性名相同,定义POPJ接收即可;

复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POPJ属性参数;

5)数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数;

6)集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系;

7)日期参数:使用@DateTimeFormat注解完成日期格式转换;

8)JSON参数:JSON数据键名与形参对象属性名相同,定义POPJ类型形参即可接收参数,需要使用@RequestBody标识;

9)路径参数:通过请求URL直接传递参数,使用{....}来标识路径参数,需要使用@PathVariable获取路径参数。

5、响应

1)响应数据

类型:方法注解、类注解;

位置:Controller方法上/类上;

作用:将方法返回值直接响应,如果返回值是实体对象/集合,将会转换为JSON格式响应;

说明:@RestController = @Controller + @ResponseBody。

2)统一响应结果

6、分层解耦

1)三层架构:数据访问、逻辑处理、接收请求响应数据;

controller:控制层,接收前端发送的请求,对请求进行处理并响应数据;

service:业务逻辑层,处理具体的业务逻辑。

dao:数据访问层,负责数据访问操作,包括数据的增、删、改、查

2)内聚:软件中各个功能模块内部的功能联系;

耦合:衡量软件中各个层/模块之间的依赖、关联的程度;

软件设计原则:高内聚低耦合。

3)控制反转:Inversion of Control,简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转;

依赖注入:Dependency Injection,简称DI,容器为应用程序提供运行时,所依赖的资源,称之为依赖注入;

Bean对象:IOC容器中创建、管理的对象,称之为bean。

4)Bean的声明

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注意事项:声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认类名首字母小写;

声明以上四个注解都可以声明bean,但在springboot集成web开发中,声明控制器bean只能用@Controller。

5)Bean组件扫描

前面声明bean的四大注解要想生效,需要被组件扫描注解@ComponentScan扫描;

@ComponentScan扫描注解虽然没有显式配置,但包含在启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包;

6)Bean注入

@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报错;

可以通过以下三个注解解决

@Primary

@Autowired + @Qualifier(''bean的名称'')

@Resource(name = "bean的名称")

@Resource和@Autowired区别

@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解;

@Autowired默认是按照类型注入,@Resource默认是按照名称注入。

三、数据库

1、数据库

1)数据库:DataBase(DB),是存储和管理数据的仓库;

数据库管理系统:DataBase Management System(DBMS),操纵和管理数据库的大型软件;

SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。

2)MySQL数据模型

MySQL中的数据类型很多,主要分为三类:数值类型、字符串类型、日期时间类型;

关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。

3)SQL语句

DDL:Data Definition Language,数据定义语言,用来定义数据库对象(数据库、表、字段);

DML:Data Manipulation Language,数据操作语言,用来对数据库表中的数据进行增删改;

DQL:Data Query Language,数据查询语言,用来查询数据库中表的记录;

DCL:Data Control Language,数据控制语言,用来创建数据库用户、控制数据库的访问权限。

4)DDL(数据库操作)

查询所有数据库:show databases;

查询当前数据库:select database();

使用数据库:use 数据库名;

创建数据库:create database[if not exists] 数据库名;

删除数据库:drop database[if exists] 数据库名;

上述语法中database可以替换成schema。

5)DDL(表操作)

create table 表名(
    字段1 字段类型 [约束] [comment 字段注释],
    ......
    字段n 字段类型 [约束] [comment 字段注释]
)[comment 表注释];

查询当前数据库所有表:show tables;

查询表结构:desc 表名;

查询建表语句:show create table 表名;

添加字段:alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];

修改字段:alter table 表名 modify 字段名 新数据类型(长度);

修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释] [约束];

删除字段:alter table 表名 drop column 字段名;

修改表名:rename table 表名 to 新表名;

删除表:drop table [if exit] 表名。

6)DML(INSERT)

指定字段添加数据:insert into 表名(字段名1,字段名2) values(值1,值2);

全部字段添加数据:insert into 表名 values (值1,值2,....)

批量添加数据(指定字段):insert into 表名 (字段名1,字段名2)values (值1,值2),(值1,值2);

批量添加数据(全部字段):insert into 表名 values (值1,值2,....),(值1,值2,....);

修改数据:update 表名 set 字段名1 = 值1 ,字段名2 = 值2,...[where 条件];

删除数据:delete from 表名 [where 条件];

注意事项:

插入数据时,指定的字段顺序需要与值的顺序是一一对应的;

字符串和日期型数据应该包含在引号中;

插入的数据大小,应该在字段的规定范围内;

修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据;

DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据;

DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。

7)DQL(SELECT)

基本查询

查询多个字段:select 字段1,字段2,字段3 from 表名;

查询所有字段(通配符):select  *  from 表名;

设置别名:select 字段1 [as 别名1],字段2[as 别名2] from 表名;

去除重复记录:select distinct 字段列表 from 表名;

条件查询

select 字段列表 from 表名 where 条件列表;

分组查询

select 聚合函数(字段列表) from 表名(将一列数据作为整体进行计算);

注意事项:null值不参与所有聚合函数运算;统计数量可以使用count(*)、count(字段)、count(常量),推荐使用count(*);

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

where 和 having 区别:

执行时机不同,where是分组之前进行过滤,不满足where条件不参与分组,而having是分组之后对结果进行过滤;

判断条件不同,where不能对聚合函数进行判断,而having可以;

注意事项:分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义;

执行顺序:where > 聚合函数 > having;

排序查询

select 字段列表 from 表名 [where 条件] [group by 分组字段] order by 字段1 排序方式1,字段2 排序方式2....;

ASC:升序(默认值)

DESC:降序

注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序;

分页查询

select 字段列表 from 表名 limit 起始索引,查询记录数;

注意事项:起始索引从0开始,起始索引 = (查询页码 - 1) *  每页显示记录数;

如果查询的是第一页数据,起始索引可以省略。

8)多表设计

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

一对多(多对一):在数据库表中多的一方,添加字段,来关联一的一方的主键;

多对多,通过中间表来维护,中间表的两个外键,分别关联另外两张表的主键;

一对一,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率;

针对两张表在数据库层面未建立关联,无法保证数据的一致性和完整性,提出外键约束。

9)多表查询

多表查询:从多张表中查询数据;

笛卡尔积:指在数学中两个集合的所有组合情况;

连接查询

内连接:相当于查询A、B交集部分数据;

隐式内连接:select 字段列表 from 表1,表2 where 条件....;

显式内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件....;

外连接

左外连接:查询左表所有数据(包括两张表交集部分数据);

select 字段列表 from 表1 left [outer] join 表2 on 连接条件....;

右外连接:查询右表所有数据(包括两张表交集部分数据);

select 字段列表 from 表1 right [outer] join 表2 on 连接条件....;

子查询:SQL语句中嵌套select语句,称为嵌套语句,又称子查询;

select * from t1 where columnl = (select columnl from t2 ....);

子查询外部的语句可以是insert/update/delete/select 中的任何一个,最常见的是select;

标量子查询:返回结果是单个值;

列子查询:返回结果为一列;

行子查询:返回结果为一行;

表子查询:返回结果为多行多列。

10)事物

事物是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败;

注意事项:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

四大特性

原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败;

一致性:事务完成时,必须使所有的数据都保持一致状态;

隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行;

持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的;

11)索引

索引是帮助数据库高效获取数据的数据结构;

结构

MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引;

二叉搜索树和红黑树存在大数据量情况下,层级深,检索速度慢问题,且二叉树在存放有序数据时会偏向一侧存放数据;

B+Tree(多路平衡搜索树)

2、MyBatis

1)MyBatis是一款优秀的持久层框架,用于简化JDBC的开发;

使用Mybatis查询所有用户数据

准备工作(创建springboot工程、数据库表user、实体类User);

引入Mybatis的相关依赖,配置Mybatis(数据库连接信息);

编写SQL语句(注解/XML)。

2)JDBC:( Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API。

3)数据库连接池是个容器,负责分配、管理数据库连接;

它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏;

标准接口:DataSource;

产品:C3P0、DBCP、Druid、Hikari。

4)Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率;

注意事项:Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)。

5)根据主键删除

SQL语句

接口方法

注意事项

如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value};

6)预编译SQL

性能跟高、更安全(防止SQL注入);

SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法;

参数占位符

7)新增

SQL语句

接口方法

新增(主键返回):在数据添加成功后,需要获取插入数据库数据的主键。

8)更新

SQL语句

接口方法

9)查询

SQL语句

接口方法

10)数据封装

实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装;

 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装;

起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样;

手动结果映射:通过 @Results及@Result 进行手动结果映射;

开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。

11)查询(条件查询)

SQL语句

接口方法

推荐下面这种,上面的写法存在SQL注入问题,且性能低不安全。

12)XML映射文件

XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名);

XML映射文件的namespace属性为Mapper接口全限定名一致;

 XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致;

使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。

13)动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL;

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL;<where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR;

动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中);

<foreach>

SQL语句

接口方法

XML映射文件

SQL片段

 <sql>:定义可重用的 SQL 片段;

 <include>:通过属性refid,指定包含的sql片段。

四、SpringBootWeb案例中用到的部分知识总结

1、开发中遇到的知识点

1)开发流程:查看页面原型明确需求;阅读接口文档;思路分析;接口开发;接口测试;前后端联调。

2)开发规范REST(REpresentational State Transfer)表述性状态转换,它是一种软件架构风格;

通过URL定位要操作的资源,通过HTTP动词(请求方式)来描述具体的操作;

GET:查询,POST:新增,PUT:修改,DELETE:删除。

3)前后端工程进行交互时,使用统一响应结果Result。

4)在类上添加@Slf4j注解时,会自动生成Logger对象,对象名:log。

5)@RequestBody:把json数据填充到实体类中。

6)@RequestMapping:简化了请求路径的定义,把公共的请求路径直接抽取到类上。

7)分页插件PageHelper是Mybatis的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。

8)本地存储:在SpringBoot中,文件上传,默认单个文件允许最大大小为 1M。如果需要上传大文件,可以进行如下配置。

spring.servlet.multipart.max-file-size=10MB //配置单个文件最大上传大小
spring.servlet.multipart.max-request-size=100MB //配置单个请求最大上传大小

9)阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务;使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

10)参数配置化:在application.properties中自定义需要的配置信息然后通过@Value注解注入。

@Value通常用于外部配置的属性注入,用法为:@Value("${配置文件中的key}")。

11)配置方式

application.properties

server.port=8080
server.address=127.0.0.1

application.yml

server:
    port: 8080
    address: 127.0.0.1

application.yaml

server:
    port: 8080
    address: 127.0.0.1

application.yml基本语法

大小写敏感;

数值前边必须有空格,作为分隔符;

使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格);

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;

# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

 yml数据格式

对象/Map集合

user:
    name: zhangsan
    age: 19
    password: 123456

数组/List/Set集合

hobby:
    - java
    - game
    - sport

 12)@ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。

13)会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应;

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据;

会话跟踪方案:

客户端会话跟踪技术:Cookie;

服务端会话跟踪技术:Session;

令牌技术;

Cookie:优点,HTTP协议中支持的技术;缺点,移动端APP无法使用Cookie  不安全,用户可以自己禁用Cookie ,Cookie不能跨域;

Session:优点,存储在服务端,安全;缺点,服务器集群环境下无法直接使用Session ,Cookie的缺点;

令牌技术:优点,支持PC端、移动端;解决集群环境下的认证问题;减轻服务器端存储压力;缺点,需要自己实现。

14)JWT令牌

定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息,由于数字签名的存在,这些信息是可靠的;

令牌生成:登录成功后,生成JWT令牌,并返回给前端。;

令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验;

JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的;

如果JWT令牌解析校验时报错,则说明 JWT令牌被篡改 或 失效了,令牌非法。

15)过滤器(Filter)

概念:Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一;

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能;

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等;

Filter 可以根据需求,配置不同的拦截资源路径:

 过滤器链:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链;

登录校验Filter-流程:

获取请求url;

判断请求url中是否包含login,如果包含,说明是登录操作,放行;

获取请求头中的令牌(token),判断令牌是否存在,如果不存在,返回错误结果(未登录);

解析token,如果解析失败,返回错误结果(未登录);

放行。

16)拦截器(Interceptor)

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行;

作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码;

拦截器可以根据需求,配置不同的拦截路径:

 过滤器和拦截器不同:

接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口;

拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源;

登录校验Interceptor流程:

获取请求url;

判断请求url中是否包含login,如果包含,说明是登录操作,放行;

获取请求头中的令牌(token), 判断令牌是否存在,如果不存在,返回错误结果(未登录);

解析token,如果解析失败,返回错误结果(未登录);

放行。

17)异常处理:全局异常处理器;@RestContrellerAdvice = @ControllerAdvice + @ResponseBody,用于创建全局异常处理类;@ExceptionHandler用于处理不同类型的异常。

2、事物管理

1)事务 是一组操作的集合,它是一个不可分割的工作单位,这些操作 要么同时成功,要么同时失败;

开启事务(一组操作开始前,开启事务):start transaction / begin ;

提交事务(这组操作全部成功后,提交事务):commit ;

回滚事务(中间任何一个操作出现异常,回滚事务):rollback 。

2)注解:@Transactional;

位置:业务(service)层的方法上、类上、接口上;

作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务。

3)开启事务管理日志

logging:  

        level:    

              org.springframework.jdbc.support.JdbcTransactionManager: debug

4)默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

@Transaction(rollbackFor = Exception.class)

5)事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制;

@Transactional(propagation = Propagation.REQUIRED)

REQUIRED :大部分情况下都是用该传播行为即可;

REQUIRES_NEW :当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

6)AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程;

场景:案例部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每一个业务方法的执行耗时,其它如记录操作日志、权限控制、事物管理等;

实现:动态代理是面向切面编程最主流的实现;而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。

7)AOP核心概念

连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息);

通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法) ;

切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用 ;

切面:Aspect,描述通知与切入点的对应关系(通知+切入点);

目标对象:Target,通知所应用的对象。

8)@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行;

@Before:前置通知,此注解标注的通知方法在目标方法前被执行;

@After :后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行; @AfterReturning : 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行; @AfterThrowing : 异常后通知,此注解标注的通知方法发生异常后执行;

@Around环绕通知需要自己调用 ProceedingJoinPoint.proceed() 来让原始方法执行,其他通知不需要考虑目标方法执行;

@Around环绕通知方法的返回值,必须指定为Object,来接收原始方法的返回值;

@PointCut:该注解的作用是将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可;

private:仅能在当前切面类中引用该表达式 ;

public:在其他外部的切面类中也可以引用该表达式。

9)通知顺序:当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行;

不同切面类中,默认按照切面类的类名字母排序:

目标方法前的通知方法:字母排名靠前的先执行 ;

目标方法后的通知方法:字母排名靠前的后执行;

用 @Order(数字) 加在切面类上来控制顺序

目标方法前的通知方法:数字小的先执行;

目标方法后的通知方法:数字小的后执行。

10)切入点表达式:描述切入点方法的一种表达式;

作用:主要用来决定项目中的哪些方法需要加入通知;

常见形式: execution(……):根据方法的签名来匹配;

@annotation(……) :根据注解匹配;

execution 主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:

其中带 ? 的表示可以省略的部分

访问修饰符:可省略(比如: public、protected);

包名.类名: 可省略 throws;

异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常);

可以使用通配符描述切入点

* :单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分;

.. :多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数;

注意事项:

所有业务方法名在命名时尽量规范,方便切入点表达式快速匹配。如:查询类方法都是 find 开头,更新类方法都是 update开头;

 描述切入点方法通常基于接口描述,而不是直接描述实现类,增强拓展性;

 在满足业务需要的前提下,尽量缩小切入点的匹配范围。如:包名匹配尽量不使用 ..,使用 * 匹配单个包。

11)连接点:在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值