理解Spring的AOP
原文链接:https://www.jianshu.com/p/78ba8bafb90a
1.AOP
AOP(面向切面)是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程(OOP);
AOP为开发者提供了一种描述横切关注点的机制,并能狗够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模快化。
AOP能够将那些与业务无关,却为业务模快所共同调用的逻辑或责任,例如事务管理,日志管理,权限控制等,封装起来,便于减少系统的重复代码,降低模快间的耦合度,并有利于未来的可操行和可维护性。
使用AOP的好处:
- 降低模快的耦合度
- 使系统容易扩展
- 体用代码复用性
AOP的基本概念
- 连接点(JoinPoint):需要在程序中插入横切关注点的点,连接点可能是在类初始化、方法调用、字段调用或处理异常等等。Spring中只支持方法执行连接点。
- 切入点(Pointcut):一组相关连接点的集合。
- 通知(Advice):在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段。包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice)。
- 切面(Aspect):通知和切入点的结合。
- 织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。
- 代理(Proxy):通过代理方式来对目标对象应用切面。AOP代理可以用JDK动态代理或CGLIB代理实现。
-
目标对象(Target):需要被织入关注点的对象。即被代理的对象。
实现AOP的主要设计模式就是动态代理。
spring的动态diamante有两种:一是JDK的动态代理;另一个就是cglib动态代理。
JDK动态代理模拟
JDK动态代理的两个核心接口(类)分别是InvocationHandler和Proxy。注意:只能代理接口。
CGLIB动态代理模拟
CGLIB动态代理的两个核心接口(类)分别是MethodInterceptor和Enhancer。是不是跟JDK动态代理很相似,用法也差不多。但CGLIB可以代理类和接口。注意:不能代理final类。
Spring AOP 的具体加载步骤![](https://i-blog.csdnimg.cn/blog_migrate/76c381562fbafe79c773d76b0d446442.jpeg)
AOP和OOP的区别,分别适用什么场景?
OOP面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异。
oop封装的是属性和方法,以对象为最小操作单元,属性和方法都要通过对象才能调。
aop封装的是业务,将主业务和通用业务区分,将通用业务划分为切面,切面又划分为通知和切入点。
Mybatis
什么是Mybatis?
-
MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。
-
我们在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作 Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。
mybatis的框架
MyBatis 的缓存
Mybatis对缓存提供支持,一级缓存是默认使用的,二级缓存需要手动开启。
区别:
- 一级缓存的作用域是一个sqlsession内;
- 二级缓存作用域是针对mapper进行缓存;
一级缓存:
在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
一次缓存执行commit,close,增删改等操作,就会清空当前的一级缓存;当对SqlSession执行更新操作(update,delete,insert)后并执行commit时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果).
二级缓存:
二级缓存指的是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句,条件,statement等信息组成一个唯一值。一级缓存中的value,就是查询出的结果对象。
1、在配置文件中 开启二级缓存的总开关
<setting name="cacheEnabled" value="true" />
2、 在mapper映射文件中开启二级缓存
<cache eviction="FIFO" flushInterval="60000" size="512"
readOnly="true"/>
参数名属性eviction收回策略flushInterval刷新间隔size引用数目readOnly只读
关于eviction的各个参数属性:
- 参数名属性eviction="LRU"最近最少使用的:移除最长时间不被使用的对象。
- (默认)eviction="FIFO"先进先出:按对象进入缓存的顺序来移除它们。
- eviction="SOFT"软引用:移除基于垃圾回收器状态和软引用规则的对象。
- eviction="WEAK"弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
禁用缓存
如测试sql语句性能时缓存会影响测试准确性 需要禁用在映射文件中:默认值是true useCache=”false”
<select id="findAllPets" resultMap="petsMap" useCache="false">
select * from pets
</select>
刷新缓存
在映射文件中:属性:flushCache=”true”刷新缓存,在查询语句中,默认值是false,在新增删除修改语句中,默认值是true(清空缓存)
为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。
mybatisPlus 是全自动ORM,mapper 继承BaseMapper<T>接口后,无需编写mapper.xml文件,即可获得CRUD功能。
Mybatis中#和$的区别?
使用场景:
-
一般${}用在我们能够确定值的地方,也就是我们程序员自己赋值的地方。${}号会SQL注入
-
而#{}一般用在用户输入值的地方!
区别:
#{}是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 “4,44,514”就会变成“ ‘4,44,514’ ”;
${}是字符串替换。MyBatis在处理 ${}时 , ,它会将sql中的{ }替换为变量的值,传入的数据不会加两边加上单引号。
Mybatis如何实现批量插入?
1.使用Mybatisplus,继承Iservice类
2. 继承ServiceImpl接口<dao,实体类>然后实现这个接口,然后在需用使用到的地方注入,就可以实现批量新增,修改等
Springboot
什么是Spring boot ?
Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot 是所有基于 Spring Framework 5.0 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。
设计目的: 用来简化新Spring应用的初始搭建以及开发过程。
从最根本上来讲,Springboot 就是一些库的集合,他能够被任意项目的构建系统所使用。他使用"习惯优于配置"(项目中存在大量的配置,此外还内置一个习惯性的配置)的理念让他的项目快速运行起来。用大佬的话来理解,就是springboot其实不是什么新的框架,他默认配置了很多框架的使用方式,就像maven整合了所有的jar包,springboot 整合了所有的框架,总结一下集几点:
-
为所有spring开发提供一个更快更广泛的入门体验。
-
零配置。无冗余代码生成和xml强制配置,遵循“约定大于配置”。
-
集成了大量常用的第三方库的配置,springboot应用为这些第三方库提供了几乎可以零配置的开箱即用的能力。
-
提供一系列大型项目常用的非功能性特征,如嵌入式服务器,安全性,度量,运行状况检查,外部配置等。
-
springboot不是spring的替代者,spring框架是通过ioc机制来管理bean的。springboot依赖spring框架来管理对象的依赖。springboot并不是spring的精简版本,而是为使用spring做好各种产品级准备。