前言
入门
ioc就是对象交给spring管理
aop就是前面的统一功能,就是对一类问题的统一处理
aop就是面向切面编程
我们主要来学习自定义aop
比如我们来打印每个接口的时间
比如这个就可以计算出一个接口的时间
而我们的aop就是计算出所有的接口的时间
先引入依赖
接下来就是告诉这个切面在哪些地方生效
就是告诉作用域
需要用到Around注解
这样就对所有的controller都生效了
这样就知道是谁了
这样就实现了aop了
概念
@Around(“execution(* com.ck.springbook.controller….(…))”)
就是切点表达式
连接点就是具体作用的方法
具体要做的事情就是通知
切面就是前面三个加起来
记得添加注解Aspect
当前有两个切面
多个切面的时候
先执行before,在执行after
目标方法在中间执行
这样我们就知道了执行顺序了
这个是没有发生异常的时候
我们发现了Around可以前处理,后处理,可以异常后处理,已经包含了前面的各个
我们如何把切点定义出来呢
避免改一个,而改动很多个
这样就可以了
发现还是可以正常运行的
其他类要调用别人的切点表达式,那么就要把路径写清楚了
但是如果pt为私有的话,就不能在其他类使用了,这个记录时间的就不能执行了
切面优先级
现在我们给它们修改顺序
这样就成功改了顺序了
切点表达式
execution
第二个星是类名,第三个星是方法名
(…)是参数,这个表示0到n个参数
t1方法本身最好设置为public
annotation
我们先来模拟实现Aspect注解
TYPE表示这个注解只能加在类上
Retention表示注解的生命周期
大括号里面可以写多个
这样就可以使用了
现在只要我们加个我们新创建的注解,就要使用这个记录时间的切面
这下就要使用annotation注解了
这样写的意思就是,只要我们方法加了这个注解,就会执行这个切面
但是我们在u2方法上面加了这个自定注解,还是没有记录时间呢
那是因为没有交给spring管理
这样就可以了
记下这个的包名
这样写的意思就是只要写了requestMaping注解的,都会执行这个切面
使用的代理模式
静态代理
代码没有要求
下面这个是房东
现在实现代理,中介
这个就是静态代理
谁代理的,运行前,在class中就确定了
但是这里一改全改,挺麻烦的
JDK动态代理
就是代理对象在运行时才创建
这个就是定义在目标方法前和后分别执行什么
就是说代理对象要做什么事情,除了完成目标方法以外(invoke)
还有前后要做什么
method就是目标方法
invoke就是去调用
target就是哪个目标方法
proxy就是代理对象
CGLIB动态代理
JDK代理只能代理接口,或者实现了接口的类
不能代理没有实现接口的类
比如controller
CGLIB既可以代理接口,也可以是类
先添加依赖
我们用哪个,后面就要接着用这个包,不要换了,不然就出错了
比如你用spring的,后面也要用spring的
这样就写好了CGLIB的代理了
这样就成功了
如果使用CGLIB的包的话,需要添加vm option
添加这个就可以了
aop就是基于动态代理实现的
具体是哪种代理,要看情况了
实现了接口的就是有implement,controller就是没有实现接口
看的出来没有实现接口的就是CGlib,而且在false下
测试这个类的时候记得加上我们自定义的aop注解,不然跟aop都没有关系了,切面的Around还要给到我们自定义的注解,还要加上注解,给spring管理的
这样就可以了
这就表示了是jdk代理了
设置为true
结论都是CGLIb代理了
如果不配置,那么就都是CGlib,默认是true的
但是jdk默认是false的
我们的spring默认是true的
我们现在设置为fasle
把接口改为类,强转为类
就会报错
这个说明了jdk不能代理类
只有在false下才存在jdk代理
而且只有接口才有jdk,jdk不能代理类,强转为lei会出错
而CGLIb类和接口都可以代理
false下
spring2.0默认是true,
以前的springframework是默认false,springboot2.0开始默认是true