Spring AOP:
1.概念:
AOP 为 Aspect Oriented Programming的缩写,意思是面向切面变成,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
是OOP的延续,是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型,用AOP可以对业务逻辑的各个部分进行隔离,使业务逻辑各部分之间的耦合度降低,提高程序可重用性和开发效率
2.AOP作用及优势:
作用:在程序运行期间,不修改源码的情况下对方法进行增强
优势:减少重复代码,提高开发效率,便于维护
3.AOP动态代理技术:
常用代理技术:
JDK代理:基于接口的动态代理技术,Spring AOP默认动态代理,只能对有接口方法进行增强
cglib代理:基于父类的动态代理技术,为拦截方法做一个父类并重写方法进行拦截
4.AOP术语:
Target目标对象:代理的目标对象
Proxy代理:一个类被AOP增强后产生的一个结果类
Joinpoint连接点:指被拦截到的点,就是指可以被增强的方法
Pointcut切入点:指我们要对哪些Joinpoint进行拦截 ***
Advice通知/增强:指拦截到Joinpoint之后要做的事情 ***
Aspect切面:切入点和通知的结合 ***
Weaving:把增强应用到目标对象来创建新的代理对象的过程 ***
5.AOP开发明确事项
1.需要编写的内容:
核心业务代码(目标方法,切点)
编写切面类,切面类中有通知(增强功能方法)
在配置文件中,配置织入关系
2.AOP技术实现的内容:
Spring框架会监控切入点方法的执行,监控到切入点方法被运行,使用代理机制,动态创建切点所在的目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行
3.AOP底层使用哪种代理方式
在Spring中,框架会根据目标类是否实现接口来决定采用哪种动态代理的方式
6.知识要点:
1.AOP:面向切面编程
2.底层实现:基于JDK的动态代理和基于cglib的动态代理
3.AOP的重点概念:
Pointcut切入点:指我们要对哪些Joinpoint进行拦截 ***
Advice通知/增强:指拦截到Joinpoint之后要做的事情 ***
Aspect切面:切入点和通知的结合 ***
Weaving:把增强应用到目标对象来创建新的代理对象的过程 ***
4.开发明确事项:
1.谁是切点
2.谁是通知
3,将切点和通知进行织入配置
7.步骤
1.导入aspectjweaver包
2.目标类
3.切面类(里面有增强方法)
4.融入Spring配置文件
5.配置织入,告诉Spring框架哪些方法需要哪些增强(前置后置.....)
1.AOP命名空间(同创建context命名空间)
2.<aop:config>
<!--声明切面-->
<aop:aspect ref="切面类的id">
<!--切面:切点+通知-->
<aop:before method="作为前置增强的方法" pointcut="execution(public void 切点类路径.切点名())"></aop:before>
</aop:aspect>
</aop:config>
6.运行测试
8.切点表达式:
语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
访问修饰符可以省略
返回值类型、包名、类名、方法名可以使用*代替代表任意
包名与类名之间的一个点.代表当前包下的类,两个点..表示当前包及其子包下的类
参数列表可以使用两个点..表示任意个数,任意类型的参数列表
9.通知类型:
前置通知:<aop:before>
后置通知:<aop:after-returning>
环绕通知:<aop:around> 方法必须携带参数:ProceedingJoinPoint Object proceed = pjp.proceed() --> return proceed
异常抛出通知:<aop:afterThrowing>
最终通知:<aop:after>
10.抽取切点表达式:
抽取:
<aop:pointcut id="" expression="[修饰符] 返回值类型 包名.类名.方法名(参数)"/>
调用:
<aop:before method="作为增强的方法" pointcut-ref="抽取表达式的id""></aop:before>
Spring AOP注解:
1.步骤:
1.创建目标接口和目标类
2.创建切面类
3.将目标类和切面类的对象创建权交给Spring
4.在切面类中使用注解配置织入关系
@Aspect:标注当前类是一个切面类
5.在配置文件中开启组件扫描和AOP自动代理(<aop:aspectj-autoproxy/>)
6.
2.注解通知的类型:
1.语法:@通知类型("切点表达式")
2.类型:同xml通知类型
3.抽取切点表达式:
定义切点表达式方法上方注解@Pointcut("切点表达式"),之后在其他类@通知类型("类名.切点表达式方法")
|
|