标签:sys 面向切面编程 out spring容器 步骤 抽取 动作 完整 catch
AOP
作用: 可以帮助你抽取共性内容, 简化我们书写, 增强我们的简单类!!!!!
概念: 面向切面编程(横向开发) OOP: 面向对象编程(竖向开发)
专业名词
连接点
指我们所有的方法
切入点
那些想要被增强的方法
切入点表达式
完整写法
execution(修饰符 返回值类型 包名.类名.方法名(参数类型))
*
匹配任意字符或者任意类型
..
匹配任意个个数或者层级
例如
execution(* cn..User*.*(..))
匹配, 任何返回值, 在cn下就行轮层级, 必须User开头的类, 方法名任意,参数个数任意, 参数类型也任意
通知
我们共性内容存放的地方
切面
来描述我们"通知"和"切入点"的关系
织入
将共性方法还原到切入点的动作
通知类型(织入类型)
前置增强
before
织入在原有逻辑之前
后置增强
after
织入在原有逻辑之后, 即使原有逻辑出现了异常也会执行!!!
后置返回结果增强
after-returning
只有原有逻辑正常执行完毕后才会增强
后置出现异常增强
after-throwing
只有原有逻辑出现异常才会增强
环绕增强
around
包含以上四种的所有特性
xml方式
AOP使用步骤
1.将你所有bean放入spring容器中
2.需要在配置文件中引入aop标签
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
3.需要配置aop, 主要配置"切面"
<aop:config>
<!--
配置切入点:
* : 匹配任意内容, 或者任意单个类型
..: 匹配任意个数, 如果在包那一块, 任意包不论层级, 如果参数部分, 代表任何个数参数, 类型不限定
-->
<aop:pointcut id="pt" expression="execution( * cn..service.UserService.*Update(..))"/>
<!-- 通过切面将 "切入点" 和 "通知" 整合在一起 -->
<aop:aspect ref="adivice">
<!-- 增强类型-->
<aop:before method="startTraction" pointcut-ref="pt"/>
<!-- after-returning,只有在方法正常执行完毕后才会执行 -->
<aop:after-returning method="commit" pointcut-ref="pt"/>
<!-- after-throwing 出现异常之后才会走 -->
<aop:after-throwing method="rollBack" pointcut-ref="pt"/>
<aop:around method="manageTransaction" pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
细节问题
在"通知"中获取"切入点"的参数
在"通知"中的方法中额外定义一个参数JoinPoint joinPoint
joinPoint.getArgs();可以获取所有的原来的参数们
特点: 每种织入类型都能够拿到参数
在"通知"中获取"切入点"的返回值
特点: 只有after-returning和around可以拿到
after-returning
可以 在我们"通知"的方法中额外定义一个参数用来接受返回值 Object result
//提交事务
public void commit(Object result){// after -returning
System.out.println("提交事务");
}
需要在配置文件中使用 returning的指向我们"通知"的方法中的参数名, 名字要对应
<aop:after-returning method="commit" pointcut-ref="pt" returning="result"/>
around
同上
在"通知"中获取"切入点"的异常
特点: 只有around 和after-throwing
after-throwing
可以 在我们"通知"的方法中额外定义一个参数用来接受返回值 Throw e
public void startTraction(Throwable e){// before
System.out.println("开启事务");
}
需要在配置文件中使用throwing的指向我们"通知"的方法中的参数名, 名字要对应
<aop:after-throwing method="startTraction" pointcut-ref="pt" throwing="e"/>
around
可以直接拿到异常, 直接try,catch包裹一样, 在自己catch里面即可拿到
注解方式
AOP使用步骤
1.需要定义"通知类", 在通知类中添加@Aspect,代表切面
2.编写切点表达式
局部
@Before("execution(切点表达式)")
全局
需要定义一个方法, 这个方法无参无返回值, 需要@PointCut(execution(切点表达式))
需要引入切点表达式
@Before("切点表达式所在的方法名()")
细节问题
同xml方式
需要在主配置中加入扫描AOP的东西
<!-- 扫描跟component有关的这些注解 -->
<context:component-scan base-package="cn.itcast"/>
<!-- 扫描跟aop有关的注解 -->
<aop:aspectj-autoproxy/>
在配置类中使用纯注解开启aop的解析
@EnableAspectJAutoProxy
标签:sys 面向切面编程 out spring容器 步骤 抽取 动作 完整 catch
原文地址:https://www.cnblogs.com/zhenyuantian/p/14337085.html