【自用】AOP

不做笔记了

xml不重要,最后都会变成注解

我懂了 反射 什么叫程序运行中 ,我还以为是在程序运行中,可以编写代码呢,原来是在程序运行中 程序可以构造任意一个类的对象 不是我!!

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

这东西说白了不就是方法分发吗,为什么叫做新功能啊

在这里插入图片描述

这样吧,我就先不做笔记了,先把课捋一遍,就是看一遍,看了一遍起码知道怎么回事了,我要是一直看到这么慢,会拉下很多进度的

一个付款码 支持三个平台(微信,支付宝和什么的)

这里只演示两个平台

【自用】AOP_第1张图片

付款的核心业务逻辑

【自用】AOP_第2张图片

这种是结构化代码,没有对象的存在,没有扩展性,我之前好像写过这种代码,用按键精灵

这种代码符合常人的思维,但是没有扩展性

比如加新的付款方法,有活动,要改里面的付款流程等等,卧槽,想想就可怕,改一个地方,其他地方,BOOM的就炸了

【自用】AOP_第3张图片

这种代码就是面向对象的一种方法

【自用】AOP_第4张图片

要付款,付款的核心对象

这里面的user也应该是一个完整的对象

【自用】AOP_第5张图片

比如它的个人信息,邮箱之类的

【自用】AOP_第6张图片

一个付款的接口,统一的方法

卧槽,等会!!!!!!要是我的某一个付款平台变了,这个统一的接口肯定就不能要了,那我怎么办,用动态代理实现执行部分功能不就行了嘛

比如统一的接口肯定有一些什么用户校验之类的, 这些都是一样的,但是肯定有一些是不一样的,比如活动判断,我CNMD,NB啊

【自用】AOP_第7张图片

一个接口,各自的平台写各自的

这个叫做oop面向对象,我感觉像是面向接口,原来面向接口是这个意思

【自用】AOP_第8张图片

然后我把这些功能搞定了,产品经理来了,他来了,他来提功能了

来计算,这个项目里面多个付款渠道。它的平均的执行效率是什么

每一次付款耗的时间

各个渠道付款的失败率

去掉付款的耗时统计

这可能是那个渠道方,要的数据

记录每一次付款耗的时间

肯定是往数据库里面记的,我学了数据库了,总不能再往txt里面记录把

这样就能计算时间了

【自用】AOP_第9张图片

好吧,果然是老师,新的问题又来的

肯定不止一个渠道啊,而且之后要去掉这个功能怎么办,挨个删吗,删错了,没删干净怎么办??

【自用】AOP_第10张图片

付款实现

【自用】AOP_第11张图片
【自用】AOP_第12张图片

统计失败率就是 记录日期和失败次数

核心代码和辅助代码

【自用】AOP_第13张图片

问题:

1、代码严重重复:重复添加,重复删除

2、辅助性的业务功能代码与核心业务代码偶合在一起,代码混乱;很容易造成bug,不好调试维护,升级维护都困难

对!!!!!就整个,妈的,测个核心代码,我还有跑一下辅助代码,之前可烦死我了,我就是想知道核心代码的问题

3、万一之后我的计算时间有bug,或者计算逻辑要改,那就是一个一个个改,我超

为了,解决这个问题,我们引入了aop面向切面编程,NB嗷,我好像去试试

什么叫做切面呢,这是一种概念

oop 面向对象编程,是面向核心业务编程

aop 面向切面编程,是面向辅助对象编程

【自用】AOP_第14张图片

付款时间

记录付款日志:a用户向b用户付了多少钱 什么时间付的,付款的结果

记录日志,首先建立一个日志对象

【自用】AOP_第15张图片

那个付款信息对象在这里

【自用】AOP_第16张图片

日志里面的方法,比如打印日志

【自用】AOP_第17张图片

我提出来的这个对象,就是辅助业务的核心对象

日志对象

【自用】AOP_第18张图片

我超,我好喜欢这节课,new了这个对象之后已经开始切面编程了,

就是我把辅助业务也封装成对象了

但是这个东西怎么用呢??

我要是把这个对象new 在这里,然后set数据进去,不是根之前一样了吗

【自用】AOP_第19张图片

动态代理

动态代理就是jdk帮你实现静态代理

我是需要用一个静态代理把支付功能包进去吗

老师说对核心业务对象创建代理对象

就是这个实现类对象里面的pay方法不满足需求了

因为它的pay方法里面只有核心的业务逻辑

我想在这个核心的代码前后 加上我的日志代码

那我就给他创建代理

【自用】AOP_第20张图片

动态代理

静态代理

【自用】AOP_第21张图片
【自用】AOP_第22张图片

实现日志方法

【自用】AOP_第23张图片

笑死了,老师Date 转时间也不会了,老师说他一直用的都是工具类

在这里插入图片描述

获取支付类型的方法

要不在创建代理的时间,把支付类型放进去(肯定不用这种啊,多蛋疼啊)

【自用】AOP_第24张图片

要不直接通过 看它走的是哪个实现类 ,去通过反射获取它的类名,当做付款渠道

【自用】AOP_第25张图片

日志已经有了

在这里插入图片描述

啊。。切面是直译的意思,妈的谁翻译的

所以它的意思不过就是面向辅助对象编程????

真他吗是个高端的名字,其实就是套个壳,我真的吐了

添加链接描述

辅助业务添加流程

在代理类里面添加

【自用】AOP_第26张图片

建立辅助对象

【自用】AOP_第27张图片

插入耗时代码

辅助性对象,可有可无,没有我的代码也能运行,不影响核心业务,随时可以去掉,随时可以插上

执行耗时的对象,我已经给他插入进去了

【自用】AOP_第28张图片

一定要注意,他是在代理类里面写的!!!

【自用】AOP_第29张图片

总结:辅助性业务就是一个又一个对象

在代理对象里面,把辅助性业务对象,插入到 核心业务对象 的前后

也就是说 在代理类里面的代码也是混杂的,只不过把 分散在其他地方的代码 集中收起来 方便管理和维护了

【自用】AOP_第30张图片

记录时间和记录日志的都是一个一个对象

对面向对象的理解更加深刻了,好耶!

【自用】AOP_第31张图片

记录失败

失败方式,失败原因

【自用】AOP_第32张图片

啊,我要死了,上面实现的是静态代理

动态代理

梳理:

【自用】AOP_第33张图片

就像是个圆,给他切一刀,就是个切面了,把东西塞进去,圆还是个圆,但是更好吃了。

如果不加东西的话,还是一样能吃

利用aop可以对业务逻辑的各个部分进行隔离

把他们分开了各自是各自的,在代理里面再把他们耦合在一起,因为他最终肯定要耦合在一起去用的,要不反射??

使业务逻辑各部分耦合度降低,提高程序的可重用性,同时明显的提高了开发的效率

不要被 在程序运行期间 迷糊,他不是说你能在程序运行期间,敲代码,热部署

而是说程序自己能做这些事

横切关注点,这个词不错诶

在这里插入图片描述

这个总结 的不错

在这里插入图片描述

传统编码方式(混杂在一起)

【自用】AOP_第34张图片
【自用】AOP_第35张图片

动态代理是一个工具类 proxy

因为我传进去的接口可能有好几个,所以他只能返回一个Object来

它里面这个

在这里插入图片描述

invocationHundler 里面的Object Proxy是干嘛的,好难啊,我好像懂了,又好像没懂

弄明白了家人们,老师课里面清清楚楚的讲过了,我还打了书签,但是我的笔记记得是个寄吧!!!!!!!!!!!!!!!!

【自用】AOP_第36张图片

我真的气死了,记笔记一点用都没有,记了这么多又是截图又是打字的,浪费时间不说,而且需要的时候居然看不懂,我太拉了!!!!

,从今天起开始只有概念性的难以理解的再记笔记,细节性的还是记视频标签

动态代理 invocationHandler里面的三个参数,第一个代表this,其他的见视频

mybatis 第三天 动态代理模式

20:46

保存生成出来的代理类

这个代理类是存到内存上去的,现在把它保存到磁盘上

在这里插入图片描述

invocationHandler就是一个大 反射器

在这里插入图片描述

所以,他帮我创建了动态代理类,我还用了手动去掉之前的实现类的方法??应该不是,接着看

【自用】AOP_第37张图片

动态代理执行书写方法(啊?这也太low了吧)

【自用】AOP_第38张图片

动态代理return

【自用】AOP_第39张图片
【自用】AOP_第40张图片

救命啊,又睡了一中午

getSecurityManager

当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。

代理类的源码我看不懂,但是我看到了源码解读,看哪个注释,大概理解了一下

添加链接描述
添加链接描述

先这样吧,我大概有那么一点朦胧的印象 关于 动态代理怎么实现的

【自用】AOP_第41张图片

aop的注解

在这里插入图片描述

用了spring 这个对象就在容器里面了,所以要用spring的方法创建?我直接从容器里面拿不就行了吗

不要害怕,固定写法

【自用】AOP_第42张图片

以add* 开头的,这也太只能了吧

【自用】AOP_第43张图片

代理类的方法会这么走

【自用】AOP_第44张图片

切入点表达式1

在这里插入图片描述

由spring来确定织入位置在哪里

视觉隔离吗,笑死了

代码还是混杂的,只不过是在代理类里面混杂的

【自用】AOP_第45张图片

笑死了,这不是和vue的那个方法(val)一样吗,你写了,就能调用,不写他就不传

【自用】AOP_第46张图片
【自用】AOP_第47张图片

和vue那个一样

【自用】AOP_第48张图片

还能取到这个值

错了,因为不确定性,最终里面只能获取到连接点信息

连接点信息,就是上面那一大堆

【自用】AOP_第49张图片

连接点和这个连接点方法,不一样

【自用】AOP_第50张图片

连接点信息是spring帮我封装起来的一堆东西

【自用】AOP_第51张图片
在这里插入图片描述

注解

【自用】AOP_第52张图片

好家伙,原来是这么判断注解的

【自用】AOP_第53张图片

注解

在这里插入图片描述

【自用】AOP_第54张图片

getMethods

1.getMethods是获取类中所有公共方法,包括继承自父类的

2.getDeclaredMethods是获取类中自己声明的方法,即自己声明的任何权限的方法,包括私有方法

遍历哪个方法上带mylog注解

【自用】AOP_第55张图片

取得注解参数

【自用】AOP_第56张图片

spring就是用这个做包扫描的

跳转表达式还可以通过自定义注解的方式

【自用】AOP_第57张图片

只要带mylog就是我的连接点方法

连接点方法,需要被扩展的方法

我超,这就被植入了?编译这么强大吗

【自用】AOP_第58张图片

取自定义注解上的 信息

【自用】AOP_第59张图片

环绕那啥

【自用】AOP_第60张图片

ProceedingJoinPoint

【自用】AOP_第61张图片

真的,我哭死,他太温柔了,还给我抛了一个异常,提醒我要别忘了异常环绕和最终环绕

所谓环,就是环绕着这个方法在执行了就是

【自用】AOP_第62张图片

我要悄悄的反射,然后惊艳所有人

在这里插入图片描述

又耦合回去了,真的我本来今天挺难受了,真是让我开心了一下,谢谢你 spring

这个里面可以直接调用 jp 来获取所有需要的属性

【自用】AOP_第63张图片
【自用】AOP_第64张图片

参数必须是process那个

【自用】AOP_第65张图片

返回值必须是大Boolean

return 辗转返回

【自用】AOP_第66张图片

取返回值是怎么回事来着 还有抛出异常

基于注解的aop 41:00

除了连接点信息,还能取到返回值信息

在这里插入图片描述

基于注解的aop 46:20

【自用】AOP_第67张图片

曹,懂了,这东西不就是局部变量吗

【自用】AOP_第68张图片

XML配置方法

【自用】AOP_第69张图片

为什么使用这个加载配置文件,因为

spring-context
Context可以理解为对BeanFactory的封装.包含BeanFactory选择/配置/Bean来源加载/定义容器启动流程,为其提供上下文以及丰富的拓展,这是直面使用者的接口.

因为只更新一条数据,居然可以这么判断ture 和 fails

【自用】AOP_第70张图片

你看这个代码,多精炼我超

【自用】AOP_第71张图片

靠!UUID,真就直接用呗

【自用】AOP_第72张图片

可能他返回的带-,那天打印看看

【自用】AOP_第73张图片

就是这玩意

【自用】AOP_第74张图片

老师说这个在项目中是不用的。。。??

老师讲的事务管理是在服务层打开连接

在这里插入图片描述

用aop的方式来做这件事,确实是辅助代码

之后最好用注解的方式,不用切入点表达式

这个解析注解是什么玩意???

后面的那个MyTransaction 是个注解

表示带有这个注解的方法,都是我的切入点方法

【自用】AOP_第75张图片

@annotation表示标注了某个注解的所有方法。

我只能先这么理解了,这个东西网上看的太复杂了

妈的,烦死了,折腾来折腾去的,还是这点东西

【自用】AOP_第76张图片

静态是全局的???? 有一个地方set了,另一个地方就能拿到???卧槽???

线程并发

两个人get set那个连接

【自用】AOP_第77张图片

m2没丢,因为m2使用的 B set get的那个conn

【自用】AOP_第78张图片

threadLocal

二、ThreadLocal与Synchronized的区别
ThreadLocal其实是与线程绑定的一个变量。ThreadLocal和Synchonized都用于解决多线程并发访问。

但是ThreadLocal与synchronized有本质的区别:

1、Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

2、Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本

,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。

而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。

一句话理解ThreadLocal,向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就只属于这个线程了。

这个我在尚硅谷那里 已经用过了,相当于工具箱,尚硅谷,又是那个练习,呜呜呜,我真的,怎么会有那么好的课 啊

单例的对象里面不能放一个 不停实例化的对象的成员变量 还是会导致线程安全问题

我真的,我以为我需要传一个conn进去,没想到还能这么用!!

【自用】AOP_第79张图片

从容器里面注入的东西绝对不能是静态的

静态变量的创建时间,是比容器创建的时间要早的

老师好像有解决办法,但是说那是新技术,先不讲

这代码可太NB了,不知道能不能跑

【自用】AOP_第80张图片

@PostConstruct

@PostContruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
添加链接描述

写的不够详细

添加链接描述

执行顺序还是不太懂,算了,。之后再说吧

添加链接描述

!!!!我超!我超!他居然是自动判断切面执行方法的吗,根据注解!!!这也太NB了吧,我真的,我第一次觉得有这么NB得东西,之前一直都是嗤之以鼻的!!!我的神啊!!

【自用】AOP_第81张图片

把当前conn给释放调,贼稳!

【自用】AOP_第82张图片

这东西写的太大了,可能把底层的东西也植入了,死进去了,代码不跑了

【自用】AOP_第83张图片

想开事务,用这个注解 注一下就行了

【自用】AOP_第84张图片

因为这个类 为了把事务提出去,已经加了代理了

所以没有事务注解的也可以 用统一最终通知

不对,上面的理解错了

@Pointcut(“execution(* com.javasm.service.impl..(…))”)

有多个方法需要织入

【自用】AOP_第85张图片

表示往那个类的哪个方法织入东西 已经往那个实现类织入了 最终通知了

【自用】AOP_第86张图片

果然不做笔记,不敲代码,学一点忘一堆,但是我现在没有办法了

不用xml配置配置类

【自用】AOP_第87张图片

这个注解是别名的意思吗

超了,我要是不懂 Alias 这个英文,这个知识点又要模模糊糊的过去了,学学英文然后去google问题啊,加油!!

【自用】AOP_第88张图片

识别 配置类上面的注解,根据注解生成容器吗

【自用】AOP_第89张图片

我真的,spring的注解也太NB了吧

【自用】AOP_第90张图片

在任何一个对象里面,只要这个自身在容器,都可以通过value注解来取值的是

好像…不如…原神…方便

【自用】AOP_第91张图片

好像不怎么方便

【自用】AOP_第92张图片

我想问一下 啊,这个init 和 close 是 spring自己帮我弄好了吗,我咋又忘了啊

【自用】AOP_第93张图片

是自动去调用对象的方法的

在这里插入图片描述

配置文件获取形参

太精巧了,心脏受不了

【自用】AOP_第94张图片

嵌套配置类

【自用】AOP_第95张图片
【自用】AOP_第96张图片

获得目标文件

【自用】AOP_第97张图片

获取到的是接口的方法???

【自用】AOP_第98张图片

这个地方,没有遍历,怎么判断的

懂了,只进了一个方法,不是进了一个数组

【自用】AOP_第99张图片

声明式事务

加注解

你可能感兴趣的:(spring)