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: . 匹配任意单个字符 除了 "\r\n" 以外
.* 表明任意字符串
详见代码:applicationContext.xml
AdvisorTest.java
顾问解决了某些方法的问题,自动代理了生成器解决了某些类的问题
咱们一直在努力将某些切面织入到某些类的某些方法里面去