不做笔记了
xml不重要,最后都会变成注解
我懂了 反射 什么叫程序运行中 ,我还以为是在程序运行中,可以编写代码呢,原来是在程序运行中 程序可以构造任意一个类的对象 不是我!!
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
这东西说白了不就是方法分发吗,为什么叫做新功能啊
这样吧,我就先不做笔记了,先把课捋一遍,就是看一遍,看了一遍起码知道怎么回事了,我要是一直看到这么慢,会拉下很多进度的
一个付款码 支持三个平台(微信,支付宝和什么的)
这里只演示两个平台
付款的核心业务逻辑
这种是结构化代码,没有对象的存在,没有扩展性,我之前好像写过这种代码,用按键精灵
这种代码符合常人的思维,但是没有扩展性
比如加新的付款方法,有活动,要改里面的付款流程等等,卧槽,想想就可怕,改一个地方,其他地方,BOOM的就炸了
这种代码就是面向对象的一种方法
要付款,付款的核心对象
这里面的user也应该是一个完整的对象
比如它的个人信息,邮箱之类的
一个付款的接口,统一的方法
卧槽,等会!!!!!!要是我的某一个付款平台变了,这个统一的接口肯定就不能要了,那我怎么办,用动态代理实现执行部分功能不就行了嘛
比如统一的接口肯定有一些什么用户校验之类的, 这些都是一样的,但是肯定有一些是不一样的,比如活动判断,我CNMD,NB啊
一个接口,各自的平台写各自的
这个叫做oop面向对象,我感觉像是面向接口,原来面向接口是这个意思
然后我把这些功能搞定了,产品经理来了,他来了,他来提功能了
来计算,这个项目里面多个付款渠道。它的平均的执行效率是什么
每一次付款耗的时间
各个渠道付款的失败率
去掉付款的耗时统计
这可能是那个渠道方,要的数据
记录每一次付款耗的时间
肯定是往数据库里面记的,我学了数据库了,总不能再往txt里面记录把
这样就能计算时间了
好吧,果然是老师,新的问题又来的
肯定不止一个渠道啊,而且之后要去掉这个功能怎么办,挨个删吗,删错了,没删干净怎么办??
付款实现
统计失败率就是 记录日期和失败次数
核心代码和辅助代码
问题:
1、代码严重重复:重复添加,重复删除
2、辅助性的业务功能代码与核心业务代码偶合在一起,代码混乱;很容易造成bug,不好调试维护,升级维护都困难
对!!!!!就整个,妈的,测个核心代码,我还有跑一下辅助代码,之前可烦死我了,我就是想知道核心代码的问题
3、万一之后我的计算时间有bug,或者计算逻辑要改,那就是一个一个个改,我超
为了,解决这个问题,我们引入了aop面向切面编程,NB嗷,我好像去试试
什么叫做切面呢,这是一种概念
oop 面向对象编程,是面向核心业务编程
aop 面向切面编程,是面向辅助对象编程
付款时间
记录付款日志:a用户向b用户付了多少钱 什么时间付的,付款的结果
记录日志,首先建立一个日志对象
那个付款信息对象在这里
日志里面的方法,比如打印日志
我提出来的这个对象,就是辅助业务的核心对象
日志对象
我超,我好喜欢这节课,new了这个对象之后已经开始切面编程了,
就是我把辅助业务也封装成对象了
但是这个东西怎么用呢??
我要是把这个对象new 在这里,然后set数据进去,不是根之前一样了吗
动态代理
动态代理就是jdk帮你实现静态代理
我是需要用一个静态代理把支付功能包进去吗
老师说对核心业务对象创建代理对象
就是这个实现类对象里面的pay方法不满足需求了
因为它的pay方法里面只有核心的业务逻辑
我想在这个核心的代码前后 加上我的日志代码
那我就给他创建代理
动态代理
静态代理
实现日志方法
笑死了,老师Date 转时间也不会了,老师说他一直用的都是工具类
获取支付类型的方法
要不在创建代理的时间,把支付类型放进去(肯定不用这种啊,多蛋疼啊)
要不直接通过 看它走的是哪个实现类 ,去通过反射获取它的类名,当做付款渠道
日志已经有了
啊。。切面是直译的意思,妈的谁翻译的
所以它的意思不过就是面向辅助对象编程????
真他吗是个高端的名字,其实就是套个壳,我真的吐了
辅助业务添加流程
在代理类里面添加
建立辅助对象
插入耗时代码
辅助性对象,可有可无,没有我的代码也能运行,不影响核心业务,随时可以去掉,随时可以插上
执行耗时的对象,我已经给他插入进去了
一定要注意,他是在代理类里面写的!!!
总结:辅助性业务就是一个又一个对象
在代理对象里面,把辅助性业务对象,插入到 核心业务对象 的前后
也就是说 在代理类里面的代码也是混杂的,只不过把 分散在其他地方的代码 集中收起来 方便管理和维护了
记录时间和记录日志的都是一个一个对象
对面向对象的理解更加深刻了,好耶!
记录失败
失败方式,失败原因
啊,我要死了,上面实现的是静态代理
动态代理
梳理:
就像是个圆,给他切一刀,就是个切面了,把东西塞进去,圆还是个圆,但是更好吃了。
如果不加东西的话,还是一样能吃
利用aop可以对业务逻辑的各个部分进行隔离
把他们分开了各自是各自的,在代理里面再把他们耦合在一起,因为他最终肯定要耦合在一起去用的,要不反射??
使业务逻辑各部分耦合度降低,提高程序的可重用性,同时明显的提高了开发的效率
不要被 在程序运行期间 迷糊,他不是说你能在程序运行期间,敲代码,热部署
而是说程序自己能做这些事
横切关注点,这个词不错诶
这个总结 的不错
传统编码方式(混杂在一起)
动态代理是一个工具类 proxy
因为我传进去的接口可能有好几个,所以他只能返回一个Object来
它里面这个
invocationHundler 里面的Object Proxy是干嘛的,好难啊,我好像懂了,又好像没懂
弄明白了家人们,老师课里面清清楚楚的讲过了,我还打了书签,但是我的笔记记得是个寄吧!!!!!!!!!!!!!!!!
我真的气死了,记笔记一点用都没有,记了这么多又是截图又是打字的,浪费时间不说,而且需要的时候居然看不懂,我太拉了!!!!
,从今天起开始只有概念性的难以理解的再记笔记,细节性的还是记视频标签
动态代理 invocationHandler里面的三个参数,第一个代表this,其他的见视频
mybatis 第三天 动态代理模式
20:46
保存生成出来的代理类
这个代理类是存到内存上去的,现在把它保存到磁盘上
invocationHandler就是一个大 反射器
所以,他帮我创建了动态代理类,我还用了手动去掉之前的实现类的方法??应该不是,接着看
动态代理执行书写方法(啊?这也太low了吧)
动态代理return
救命啊,又睡了一中午
getSecurityManager
当运行未知的Java程序的时候,该程序可能有恶意代码(删除系统文件、重启系统等),为了防止运行恶意代码对系统产生影响,需要对运行的代码的权限进行控制,这时候就要启用Java安全管理器。
代理类的源码我看不懂,但是我看到了源码解读,看哪个注释,大概理解了一下
先这样吧,我大概有那么一点朦胧的印象 关于 动态代理怎么实现的
aop的注解
用了spring 这个对象就在容器里面了,所以要用spring的方法创建?我直接从容器里面拿不就行了吗
不要害怕,固定写法
以add* 开头的,这也太只能了吧
代理类的方法会这么走
切入点表达式1
由spring来确定织入位置在哪里
视觉隔离吗,笑死了
代码还是混杂的,只不过是在代理类里面混杂的
笑死了,这不是和vue的那个方法(val)一样吗,你写了,就能调用,不写他就不传
和vue那个一样
还能取到这个值
错了,因为不确定性,最终里面只能获取到连接点信息
连接点信息,就是上面那一大堆
连接点和这个连接点方法,不一样
连接点信息是spring帮我封装起来的一堆东西
注解
好家伙,原来是这么判断注解的
注解
getMethods
1.getMethods是获取类中所有公共方法,包括继承自父类的
2.getDeclaredMethods是获取类中自己声明的方法,即自己声明的任何权限的方法,包括私有方法
遍历哪个方法上带mylog注解
取得注解参数
spring就是用这个做包扫描的
跳转表达式还可以通过自定义注解的方式
只要带mylog就是我的连接点方法
连接点方法,需要被扩展的方法
我超,这就被植入了?编译这么强大吗
取自定义注解上的 信息
环绕那啥
ProceedingJoinPoint
真的,我哭死,他太温柔了,还给我抛了一个异常,提醒我要别忘了异常环绕和最终环绕
所谓环,就是环绕着这个方法在执行了就是
我要悄悄的反射,然后惊艳所有人
又耦合回去了,真的我本来今天挺难受了,真是让我开心了一下,谢谢你 spring
这个里面可以直接调用 jp 来获取所有需要的属性
参数必须是process那个
返回值必须是大Boolean
return 辗转返回
取返回值是怎么回事来着 还有抛出异常
基于注解的aop 41:00
除了连接点信息,还能取到返回值信息
基于注解的aop 46:20
曹,懂了,这东西不就是局部变量吗
XML配置方法
为什么使用这个加载配置文件,因为
spring-context
Context可以理解为对BeanFactory的封装.包含BeanFactory选择/配置/Bean来源加载/定义容器启动流程,为其提供上下文以及丰富的拓展,这是直面使用者的接口.
因为只更新一条数据,居然可以这么判断ture 和 fails
你看这个代码,多精炼我超
靠!UUID,真就直接用呗
可能他返回的带-,那天打印看看
就是这玩意
老师说这个在项目中是不用的。。。??
老师讲的事务管理是在服务层打开连接
用aop的方式来做这件事,确实是辅助代码
之后最好用注解的方式,不用切入点表达式
这个解析注解是什么玩意???
后面的那个MyTransaction 是个注解
表示带有这个注解的方法,都是我的切入点方法
@annotation表示标注了某个注解的所有方法。
我只能先这么理解了,这个东西网上看的太复杂了
妈的,烦死了,折腾来折腾去的,还是这点东西
静态是全局的???? 有一个地方set了,另一个地方就能拿到???卧槽???
线程并发
两个人get set那个连接
m2没丢,因为m2使用的 B set get的那个conn
threadLocal
二、ThreadLocal与Synchronized的区别
ThreadLocal其实是与线程绑定的一个变量。ThreadLocal和Synchonized都用于解决多线程并发访问。
但是ThreadLocal与synchronized有本质的区别:
1、Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
2、Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本
,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。
一句话理解ThreadLocal,向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就只属于这个线程了。
这个我在尚硅谷那里 已经用过了,相当于工具箱,尚硅谷,又是那个练习,呜呜呜,我真的,怎么会有那么好的课 啊
单例的对象里面不能放一个 不停实例化的对象的成员变量 还是会导致线程安全问题
我真的,我以为我需要传一个conn进去,没想到还能这么用!!
从容器里面注入的东西绝对不能是静态的
静态变量的创建时间,是比容器创建的时间要早的
老师好像有解决办法,但是说那是新技术,先不讲
这代码可太NB了,不知道能不能跑
@PostConstruct
@PostContruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
添加链接描述
写的不够详细
执行顺序还是不太懂,算了,。之后再说吧
!!!!我超!我超!他居然是自动判断切面执行方法的吗,根据注解!!!这也太NB了吧,我真的,我第一次觉得有这么NB得东西,之前一直都是嗤之以鼻的!!!我的神啊!!
把当前conn给释放调,贼稳!
这东西写的太大了,可能把底层的东西也植入了,死进去了,代码不跑了
想开事务,用这个注解 注一下就行了
因为这个类 为了把事务提出去,已经加了代理了
所以没有事务注解的也可以 用统一最终通知
不对,上面的理解错了
@Pointcut(“execution(* com.javasm.service.impl..(…))”)
有多个方法需要织入
表示往那个类的哪个方法织入东西 已经往那个实现类织入了 最终通知了
果然不做笔记,不敲代码,学一点忘一堆,但是我现在没有办法了
不用xml配置配置类
这个注解是别名的意思吗
超了,我要是不懂 Alias 这个英文,这个知识点又要模模糊糊的过去了,学学英文然后去google问题啊,加油!!
识别 配置类上面的注解,根据注解生成容器吗
我真的,spring的注解也太NB了吧
在任何一个对象里面,只要这个自身在容器,都可以通过value注解来取值的是
好像…不如…原神…方便
好像不怎么方便
我想问一下 啊,这个init 和 close 是 spring自己帮我弄好了吗,我咋又忘了啊
是自动去调用对象的方法的
配置文件获取形参
太精巧了,心脏受不了
嵌套配置类