AOP简介
AOP入门
AOP配置(XML)
AOP配置(注解)
AOP 案例
事务管理(底层也是aop)
AOP简介
1.AOP概念
2.AOP作用
3.AOP优势
AOP概念:
AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构
AOP弥补了OOP的不足,基于OOP基础之上进行横向开发
OOP规定程序开发以类为主体模型,一切围绕对象进行,完成某个任务先构建模型
AOP程序开发主要关注基于OOP开发中的共性功能,一切围绕共性功能进行,完成某个任务先构建可能遇到的所有共性功能(当所有功能都开发出来也就没有共性与非共性之分)
oop主要是继承关系,上下级关系
aop围绕共性功能,新增两个模块的共有的功能
aop底层就是动态代理
aop不会重组原来的代码,而是在原来的代码上进行增强
AOP作用
伴随着AOP时代的降临,可以从各个行业的标准化、规范化开始入手,一步一步将所有共性功能逐一开发完毕,最终以功能组合来完成个别业务模块乃至整体业务系统的开发
目标:将软件开发由手工制作走向半自动化/全自动化阶段,实现“插拔式组件体系结构”搭建
AOP优势
提高代码的可重用性
业务代码编码更简洁
业务代码维护更高效
业务功能扩展更便捷
AOP相关概念
Joinpoint(连接点):就是目标类中的所有方法(要增强的类)
Pointcut(切入点):就是挖掉共性功能的方法(真正增强的方法)
Advice(通知):扩展出来的功能方法
Aspect(切面):通知和切入点方法整合到一起
Target(目标对象):就是要增强的方法的某一个类
Weaving(织入):把原有功能和扩展的功能整合到一起,产生代理对象的过程
Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
AOP入门案例
入门案例制作分析
1. 导入依赖
2. 定义UserService接口和实现类
3. 定义扩展功能类MyAdvice,里面定义一个方法
4. 把这两个类都交给spring管理
5. 配置AOP, 把MyAdvice的方法增强到UserServiceImpl的方法上
6. 执行单元测试
AOP配置
先加依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
在applicationContext.xml
<!--原始的功能要配置成spring控制的资源-->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
<!--抽取的功能要配置成spring控制的资源-->
<bean id="myAdvice" class="com.itheima.aop.AopAdvice"/>
<!--aop配置-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(* *..*())"/>
<!--配置切面-->
<aop:aspect ref="myAdvice">
<!—通知与切入点之间的关系-->
<aop:before method="logAdvice" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
切入点
切入点描述的是某个方法
切入点表达式是一个快速匹配方法描述的通配格式,类似于正则表达式
切入点表达式的组成
关键字(访问修饰符 返回值 包名.类名方法名 (参数) 异常名)
关键字:描述表达式的匹配模式
访问修饰符:方法的访问控制权限修饰符 一般省略它不写
类名:方法所在的类(此处可以配置接口名称)
异常:方法定义中指定抛出的异常
切入点表达式——通配符
* :单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现(1个)
.. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写(0或多个)
AOP的通知类型共5种
1.前置通知:原始方法执行前执行,如果通知中抛出异常,阻止原始方法运行
应用:数据校验 Before
2.后置通知【最终通知】:原始方法执行后执行,无论原始方法中是否出现异常,都将执行通知
应用:现场清理 After
3.返回后通知:原始方法正常执行完毕并返回结果后执行,如果原始方法中抛出异常,无法执行
应用:返回值相关数据处理 AfterReturning
4.抛出异常后通知:原始方法抛出异常后执行,如果原始方法没有抛出异常,无法执行
应用:对原始方法中出现的异常信息进行处理 AfterThrowing
5.环绕通知:在原始方法执行前后均有对应执行执行,还可以阻止原始方法的执行
应用:十分强大,可以做任何事情 Around
环绕增强比较特殊:需要我们在这个增强的方法里面手动调用目标方法(就是要增强的方法)
这样就可以在调用的前后再写其他的代码,形参环绕的效果了
具体步骤:
1.方法参数要声明一个ProceedingJoinPoint的参数
2.在环绕方法里面,使用参数来调用目标方法
3.环绕增强,不仅可以调用目标方法(joinPoint.proceed)、操控目标方法的参数(joinPoint.getArgs())、还得到目标方法执行结束的返回值(也要目标方法有返回值才行)
总结:
在spring中使用@Service等注解,需要在xml中开启ioc和DI开关<context:component-scan base-package="com.itheima"/>
在spring中使用aop的注解需要在xml中开启aop开关:<aop:aspectj-autoproxy/>
面向切面编程,在不改变源码的前提下,完成原有功能的升级扩展
AOP配置(注解)
快速入门操作:
导入坐标(伴随spring-context坐标导入已经依赖导入完成)
开启AOP注解支持
配置切面@Aspect
定义专用的切入点方法,并配置切入点@Pointcut
为通知方法配置通知类型及对应切入点@Before
@Aspect:类上定义,设置当前类为切面类
@Before:方法上定义,标注当前方法作为前置通知(增强的方法)
@Pointcut:方法上定义,使用当前方法名作为切入点引用名称(要增强的方法)
@After:
@AfterReturning:
@AfterThrowing:
@Around:切入点,增强的方法
@EnableAspectJAutoProxy:用在配置类上,设置当前类开启AOP注解驱动的支持,加载AOP注解