AOP的概念
1:理解AOP是什么
* AOP Aspect-oriented programming 面向切面(方面)的编程
* AOP的实现可以对业务逻辑和系统级的服务进行隔离,使业务逻辑跟各系统服务之间的耦合度降低
提高程序的重用性和开发效率。
业务逻辑:某个类的某个方法要实现的功能
系统级服务:系统日志,事务 ,安全性验证
2:怎么实现AOP
* AOP实现的原理都是通过动态代理来实现的
详见:DynamicProxyTest.java
注意:有两种实现方式 jdk的动态代理和cglib动态代理
jdk的动态代理机制只能代理实现了接口的类(基于接口编程)
cglib的动态代理可以代理没有实现接口的类,也可以代理实现了接口的类
3:AOP的一些专业术语
* 切面(Aspect) 就是交叉在各个业务逻辑中的系统服务 ,类似于 安全验证,事务处理,日志记录
* 织入(weaving) 就是讲切面的实现插入到目标方法的过程
* 连接点(JoinPoint) 就是理论上可以被切面织入的方法 比如StudentServiceImpl类里面的所有方法
* 切入点(PointCut) 就是实际上被切面织入的方法 比如事务控制 add update del
* 目标对象(target) 就是包含了被切面织入的方法 的类 ---StudentServiceImpl
* 通知(Adivce) 就是切面的实现
* 顾问(Advisor) 其实就是通知的一个封装和延伸 可以将通知以更复杂的方式织入到某些方法中
4: spring的AOP实现
4.1 引入两个jar包
* spring-aop-4.2.1.RELEASE.jar
* aopalliance-1.0.jar
4.2 各种通知(前置通知,后置通知,环绕通知,异常通知) 的代码
MethodBeforeAdvice spring前置通知需要实现的接口
AfterReturningAdvice spring后置通知需要实现的接口
MethodInterceptor spring环绕通知需要实现的接口
4.3 配置通知 和应用通知
* 配置目标对象类
* 配置通知
* 配置代理生成器
ProxyFactoryBean
4.4 通知注意点
* 在代理类生成器的配置里面 ,关于接口的属性默认可以不用 <property name = "interfaces values">
* 因为后置通知是在目标方法执行之后才执行,他可以得到目标方法的返回值,但是不能更改它的返回值
* 环绕通知既有在目标方法执行前的代码,也有在目标方法执行后的代码,他不仅可以得到目标方法的返回值
而且可以改变他
详见代码:com.tz.springstudy.sysmanage.advice.*
applicationContext.xml
AdviceTest.java
4.5 顾问(advisor) 它将通知进行了包装, 将切面织入到指定的某些方法当中
PointcutAdvisor是顾问的一种,它有两种实现方式
* 名称匹配方法切入点顾问
NameMatchMethodPointcutAdvisor
* 正则表达式匹配方法切入点顾问
RegexpMethodPointcutAdvisor
a: * 匹配前面的表达式任意次 比如 ab* 能匹配ab abb abbb abbbbbb
b: . 匹配任意单个字符 除了 "
" 之外
.* 代表任意字符串
详见代码:applicationContext.xml
AdvisorTest.java
顾问解决了某些方法的问题,自动代理了生成器解决了某些类的问题
我们一直在努力将某些切面织入到某些类的某些方法里面去