AOP的介绍
在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之
前写好的方法中的指定位置 这种编程的方式叫AOP
AOP的底层用的代理,代理是一种设计模式
静态代理
玩家类
代理类
他们的接口
最后用接口接收代理的类实现静态代理
总结:在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之
前写好的方法中的指定位置
弊端:需要为每一个被代理的类创建一个“代理类”,虽然这种方式可以实现,但
是成本太高
使用jdk动态代理增加日志功能:动态生成代理类
首先先创建接口
继承接口实现增加功能
创建一个类继承InvocationHandler为了执行要代理的方法
首先创建被代理对象(公共代理对象)
创建构造方法给对象赋值
创建代理的执行方法
args是传进来参数的地址,转成list获取值
invoke()负责执行要代理的方法,target要代理的对象,args传入参数的地址,最后返回方法结果
test方法
调用自己类里的createProxy方法new 要用对象的类给他转换成继承的接口
用接口调用方法
createProxy方法
第一句类加载器传入代理类接口(接口是传入的方法的参数)
第二句指定代理类类型(大多数情况固定写法,改个接口名就能用)
第三句调用创建的类
第四句创建代理类
第五句输出动态代理类
第六句写要调用的方法
以上是jdk动态代理
jdk动态代理 :必须保证被代理的类实现了接口
切面的结构如下图
首先要导入一个切面和spring配合的依赖包
解释@Before execution固定写法
第一个*代表要增强类中方法的类型(如public)和返回值(如:void)写*的话就是万能的private私有或者返回值是string都行,cn.tulingxueyuan.service是该项目下要增强的包
..*.*(..)此包下所有的子孙包和类和类的方法和任何方法的参数
剩下此类的注解都里面意思都和before注解意思相同
aop必须在xml设置扫描包和开启aop
在最后查询数据的时候一定要写空指针异常要不容易出错
调用RoleDaoImpl里的方法
最后执行结果
jdk:实现动态代理需要实现类必须继承接口
cglib :实现动态代理不需要接口
但是在实际生活整项目有的继承接口有的不继承但是都需要动态代理的话就用aop里
aop:完美的把两种代理结合起来都能使用,如下图和下下图
第一张图继承接口用接口输出
第二种图没继承接口用类输出
两者都可以实现动态代理在aop中
什么是AOP?
在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之
前写好的方法中的指定位置 这种编程的方式叫AOP
JDK动态代理和CGLIB动态代理的区别?
jdk:实现动态代理需要实现类必须继承接口
cglib :实现动态代理不需要接口
解释一下spring AOP里面的几个名词?
@Aspect:用于设置增强类,下面的注解是增强类里的
@Before:在目标方法之前运行:前置通知
@After:在目标方法之后运行:后置通知
@AfterReturning:在目标方法正常返回之后:返回通知
@AfterThrowing:在目标方法抛出异常后开始运行:异常通知
@Around:环绕:环绕通知
搭建基于spring的AOP
整篇文章就是搭建基于spring的AOP