AOP之XML开发
技术:动态代理技术
作用:将动态代理重复代码抽取出来,减少重复代码、提高开发效率 、降低维护难度
典型应用:事务管理
概念 | 含义 |
---|---|
pointcut(切点) | 对哪些方法进行拦截 |
advice(通知) | 对拦截方法增强方法 |
weaving(织入) | 把通知放入增强对象以建立动态代理 |
aspect(切面) | 通知+切点 |
proxy(代理类) | aop织入后产生一个代理类 |
切面= 通知+切点
引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
通知类
public class TongZhi {
public void before(){//切面执行前执行
System.out.println("前置通知");
}
public void afterReturn(){//切面返回结果之前执行,它和异常通知只能执行一个
System.out.println("后置通知");
}
public void exception(Exception e){//出现异常,执行
System.out.println("异常通知"+e);
}
public void after(){//切面执行后执行,一定会执行
System.out.println("最终通知");
}
//ProceedingJoinPoint 可以执行切点方法
public void around(ProceedingJoinPoint joinPoint){//环绕通知
before();//以上的加和
try {
joinPoint.proceed();
afterReturn();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
after();
}
}
通知类编写完以后,在配置文件中配置切面
<!-- aop配置 -->
<aop:config>
<!-- 配置切面 ref 引用通知类 -->
<aop:aspect ref="tongzhi">
<!-- 配置切点-->
<aop:pointcut id="incepter" expression="execution(* cn.itcast..*.*(..))"/>
<!-- 通知织入切点 -->
<!-- 前置通知 -->
<aop:before method="before" pointcut-ref="incepter"></aop:before>
<!-- 后置通知 -->
<aop:after-returning method="afterReturn" pointcut-ref="incepter"></aop:after-returning>
<!-- 异常通知 -->
<aop:after-throwing throwing="e" method="exception" pointcut-ref="incepter"></aop:after-throwing>
<!-- 最终通知 -->
<aop:after method="after" pointcut-ref="incepter"></aop:after>
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="incepter"></aop:around>
</aop:aspect>
</aop:config>
需要注意的是:对象执行切点方法时,按照织入方式执行通知。隐含条件:该对象必须是从spring容器获取,new 出来的不行