aop技术概述

手写Spring框架

今天主要是去写一个Spring事务框架,我要我们自己写一个,主要是知道Spring底层事务的实现原理,我们现在进入源码分析阶段,

会讲到哪些内容,我明天会把这个图完善的比较好的,你们如果到了今后的时候,我们分析到哪些原理呢,我们现在已经到了源码分析

阶段,首先我们会讲到Spring的事务的原理分析,我们讲事务原理分析的时候,没有带大家看源码,因为看源码是比较绕的过程,所以

改成手写Spring事务,何况你去看源码,然后第二个还有一个比较核心的知识,就是Spring的IOC,我们会讲手写IOC,然后还有一个

比较重要的知识,有没有人知道SpringMVC,其实在SpringMVC里面,问的比较多的一个知识,就是SpringMVC的执行流程,不知道你们

有没有听说过,执行流程,我会带着大家手写SpringMVC的执行流程,记住是手写的,手写的基本功能,然后在这个时候我会给大家

总结一下,基本核心源码API,什么工厂bean,我会给你们详细讲到,还有会讲到bean的生命周期,这是我讲Spring核心的源码,

你们只要把事务搞懂了之后,你都不会怕问事务的原理是什么,因为你们都手写出来了,这一周讲的都是源码这一块的,

Spring讲完了之后,我们会手写一个ORM框架,讲一下Mybatis一些简单的功能,手写ArrayList,手写Set集合,手写HashMap集合,

我在这边会首先这三个集合,只要把这三个集合搞懂,我可能写源码的时候没有讲太多别人怎么写的,可能都是根据自己的思路去写的,

可能和真的源码有点差别,不能按照别人的思路去做,我觉得我有我自己的思路,

万一比JVM写的更好呢,我们可能都是手写的,在这边我们讲一下什么,为什么要讲手写ArrayList,再讲手写Set,你只要把这两个讲清楚的

情况下,再讲手写HashMap,那很容易的,你只要把前面两个搞会了,讲熟悉HashMap,非常非常容易的,可能HashMap是最难的,他需要整合到

ArrayList的一些原理,Set里的一些原理整合在一起,所以这里你们会用到链表技术,如果我把手写HashMap讲完了之后,你们记不记得

有一个没有讲的,Lock,就是Lock集合,底层是使用AQS进行包装的,为什么今天不讲呢,底层通过双向链表,我们专门把链表讲完之后,

这个时候你就会知道Lock锁底层是使用AQS包装起来的,有人问有没有手写TOMCAT,我们把分布式微服务讲完后,NIO,netty框架,

讲完这两个框架之后,我们再讲手写TOMCAT,因为会用到NIO和netty框架,有个技术整合起来,其实手写TOMCAT并没有你们想的那么

难,你们只要记住一点,基于请求和响应,你们只要把请求的类和响应的类,如果你能把它写出来,基本的TOMCAT你都能使用的,

你们不要觉得TOMCAT特别难,你们如果想写的特别好的情况下,绝对不是你一个人能够写的出来的,因为它组件比较多,

可以手写,没有你们想的那么难,最简单的一种,手写Spring事务,原理是什么,因为这个能听懂的情况下

 

你们有没有人对Spring事务有深入了解过的,事务底层是怎么去封装起来的,怎么去进行实现的,这个你们有有没谁知道的,

事务的整个底层实现原理,动态代理,从最基础的去讲原理,你们可能学过Spring的事务原理,是基于什么实现的,是基于AOP

进行实现的,在这里你们要知道,AOP里面可能有一些特性,环绕通知,异常通知,前置通知,后置通知,AOP环绕通知和异常通知,

实现Spring的事务,那我跟你讲一下,你待会会知道,我为什么把这个话说出来,因为我们待会手写,你们现在不懂没关系,

大致知道概念就行了,Spring他的事务是基于AOP的环绕通知和异常通知实现的,有些人会想到,环绕是干嘛用的,不懂没关系,

因为我会从基础给你们转变到深入里面去的,然后在这里讲一下,在Spring事务里面,分为两种,那两种呢,一种叫做编程式的

事务,然后第二种叫做声明式的事务,有的地方进行什么叫法,这是我们要给你们说一下的,有的地方吧AOP的原理是这样表达

的,我觉得这样描述也是非常准的,就是Spring的底层事务底层使用什么呢,使用编程事务进行包装的,这个包装的话就会采用到

什么呢,AOP技术,就是这样的,所以你们现在还不知道编程式事务是干嘛用的,编程式事务就是手动begin,手动commit,手动去rollback,

做回滚这个,其实底层是通过编程事务加上AOP技术包装出来的,最后等于声明式事务,声明式事务有注解版本的,我们今天是使用

编程式事务去实现事务原理,我们会实现注解版事务底层实现原理,直接实现他一个类似的功能,我会在这里讲一些概念,你们就

根据我的概念去想就行了,我们首先打开一个画图,我们在讲Spring的时候,你们说一下Spring里面有几个比较核心的技术,

你们谁能够说一下,核心技术有几个,谁能够说一下的,依赖注入,AOP,IOC,DI,那么核心就是IOC和AOP,那么核心就这两个,

IOC和AOP,这个可能是必问的,这个时候大家可以注意一下,我们今天将AOP,问一下你们,什么是AOP,什么是AOP技术,

AOP技术应用的一个场景,为什么要用AOP技术,首先有人想到了,AOP技术是面向切面编程,这是很多人初学的时候,

都不知道AOP到底干嘛用的,我告诉你们以后你们真正做开发的时候,这个AOP技术其实用的非常非常多的,为什么说用的

非常多呢,我们就说简单点,有什么目的呢,解决代码复用的问题,可能有人不理解,他为什么能够解决代码复用的问题,

有这种疑问,我相信很多同学都用过Spring的,你不用说的那么绕,我们公司里面为什么用到AOP技术呢,就是因为它可以

解决代码复用问题,你们只要能把复用问题答出来就行了,这个时候我给你们说一下,比如我们来举个例子,你们现在可以去

思考一下,比如我们现在实现一个WEB项目,在web项目中每个请求都需要打印日志,你们说下怎么办,我只要客户端和服务端

请求的时候,你们应该怎么解决,怎么去解决,想一想,比如我们现在的web请求日志里面,每个请求都需要打印日志,

假如我现在有几千个请求,几万个请求,那你觉得该怎么办,其实我告诉你们,你们会在后面用到了,你们在做企业项目的时候

你们就会知道,像我们的企业的项目日志是怎么处理的呢,不是用过滤器,过滤器拦截器确实可以做,但是不推荐使用拦截器,

你们这边可以看一下,这是我们实打实的一个微服务的电商项目,他就用到了AOP的编程的,你们可能看一下就知道,我们为什么

用到AOP编程呢,你们之后会学到的,在微服务电商项目里面是怎么去处理日志的呢,你们可以看一下,它是怎么打印日志的,

这其实是一个AOP编程,他其实日志是怎么打印的呢,只要依赖我这个类,依赖完了以后,这里面就会有前置通知和后置通知,

在你方法之前和之后,都会拦截,然后这里我就直接通过AOP编程,给你去打印这样的一个日志的,我就不去演示,你们以后会

用到的,有的人说打印日志不是很简单吗,log.info("userId:" + userId),如果不去重构的话,那么我在这边有几千个方法,

每个方法都要写一下,那是非常丑的,非常难看的,如果你们工作之后在方法前后打印日志,都是非常low的,所以你们可以看到,

在我们的企业项目里面,微服务电商里面,根本就没有打印日志,打印日志都是通过AOP编程,在你方法之后和之前进行拦截,

打印这样的一些参数,这就是AOP编程的一个应用场景,首先AOP的应用场景的一个地方就是日志,还有一个地方叫做事务,

这个事务为什么会用到AOP编程,这是为什么,你们要知道AOP编程是做什么目的,在这里我们说一下AOP编程的核心点,

在方法之前或者之后处理事情,有人会说,这是什么意思啊,在方法之前或之后处理事情,这是啥意思,我可以举个例子出来,

你们学过代理设计模式没有,有没有了解代理设计模式,是不是相对于中介一样的,什么意思呢,AOP底层实现原理,是代理

设计模式,这就有人问,什么是代理设计模式,我给你们讲讲,代理设计模式,他可以拦截你的方法,在你的方法之前和之后

做一个处理,我不用暴露我的真实方法,什么意思呢,在待会我会讲到代理设计模式的,其实你们可以怎么去举例子呢,

假设我找范冰冰给我打广告,正常情况下你是不能直接找到范冰冰的,你需要找到范冰冰的经纪人,我和范冰冰进行联系

之后,经纪人再和范冰冰联系,是不是能够让范冰冰来做代言,目的什么意思呢,能够隐藏真实的方法和参数,他像个中介

一样的,这样的话我可以在之前和之后做一个处理,待会我会画图去讲解,你们现在真不懂没关系,我之前讲过代理设计模式的,

在这里给你们讲一下,你们现在如果是有人在初学的时候,就不用去想,就记住一句话,AOP其实就是面向切面编程,

他就是在方法之前和之后做一些事情,你就这样理解就行了,待会会细说的,这个时候你就可以去想一下事务,事务里面

会用到这样的一个AOP编程的,这我就想给你们讲一下,你回头看见我刚才说的一句话,我刚才说的这样一句话,Spring的事务

会基于Spring的环绕通知,他在你的方法之前做了一个begin,方法执行完没有抛异常的情况下,我就会做一个commit,

如果是发生异常的情况下,抛出去的时候会走异常通知,待会会讲到手写Spring事务,怎么写呢,大家可以看一下例子,

预习一下,会慢慢的给你讲到的,我会讲到适用场景,叫做权限,如果我不允许你这个方法调我的方法,那我会用AOP方法

进行拦截,还有哪些地方用到了AOP技术的,你们可以再想想,还有没有,你们可以想想,绝对还有很多地方,参数验证,

这个也可以,其实我讲一下,这个比较多啊,多数据源不是,它是通过包名来区分到底是属于哪个数据源的,在这里

参数验证也是可以的,其实这种场景比较多,你只要把事务,日志,权限这三个,能把这个谈出来就非常好,还有性能监控,

这个其实比较好,这也是比较好的,AOP主要是这几个点,日志记录,性能统计,安全控制,事务处理和异常处理,这个大体的说一下,

我做项目的时候,哪些地方用到AOP编程呢,就是做日志处理,反正就是应用场景比较多,但是归根结底,你们就记住一个思想,

它是给我们提高代码复用的一个问题,记住这一点就行了,在这里我们谈论前面两点,我们为什么要用到AOP技术,

首先是复用和解耦,这是最基本的,还有一个就是代码的复用机制,反正归根结底就是一句话,少写代码,反正我觉得,

你们以后只要在业务逻辑上面,代码不重复的情况下,在AOP编程里面,还有几个名词,不知道你们听过没有,

第一个叫做切入点,还有第二个叫做切面,第三个我们可以叫做关注点,这个时候我问你们,关注点和切点,切面到底是

一个什么意思呢,关注点是什么意思呢,你们就可以这样理解,我很多地方都需要打印请求日志,这个点是我先做要关注一下的,

因为它现在需要打印日志了,这就是我关注的点,关注点我们可以叫做重复的代码,重复的代码就可以把它叫做关注点,

就是相同点,所以大家不要想得非常的复杂,关注点就是重复代码,就是用来解决重复代码的问题,那切入点是什么意思呢,

我们先说切面,在说切入点,切面是什么意思,切面大家可以这样理解,相当于关注点他形成的类,叫做关注点形成的类,

可以叫做切面类,有些人可能不理解是什么意思,我大体说一下,相当于把很多重复代码抽取出来,就相当于把重复的代码

抽取出来,抽取出来之后呢,在通过切面类的方式,去进行执行,这个我不知道你们理解不理解是什么意思,你们怎么理解,

而是在切面类里面执行的,可以这样理解,动态进行织入的,在运行的时候业务方法动态植入的,我们也可以把它叫做切面

类的代码,切入点其实很多同学比较好理解的,待会会细说,那么切入点是什么意思呢,我们就可以把它叫做执行目标的

对象,哪些代码可能会用到我们这些AOP技术,哪些方法需要被拦截,假如我想让我的test方法打印日志请求,我们就可以认为

在这个点可以切入进去,那么通过切入点的话,在这个方法之前拦截这个参数,切面类的代码进行执行,你们现在绕的话很正常,

初学AOP的时候都会觉得比较绕,代码演示完了之后,你们就会理解的,AOP的几个点大致的说一下

SpringAOP原理
AOP编程技术

什么是AOP编程
AOP: Aspect Oriented Programming 面向切面编程。
  面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的
可重用性,同时提高了开发的效率。
  AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。
  主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
  主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,
通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改  变这些行为的时候不影响
业务逻辑的代码。

  可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),
而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志记录等等)。由此可见,AOP是OOP的
一个有效补充。
注意:AOP不是一种技术,实际上是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现。

Aop,  aspect object programming  面向切面编程
	功能: 让关注点代码与业务代码分离!
关注点
	关注点,重复代码就叫做关注点;
切面
	 关注点形成的类,就叫切面(类)!
	 面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候网业务方法上动态植入“切面类代码”。
切入点
	执行目标对象方法,动态植入切面代码。
	可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值