注解方式实现 AOP 编程 步骤:
1) 先引入 aop 相关 jar 文件 (aspectj aop 优秀组件)
2) bean.xml 中引入 aop 名称空间
3) 开启 aop 注解
4) 使用注解
@Aspect 指定一个类为切面类
@Pointcut("execution(* com.haicao.service.UserService.add(..))") 指 定
切入点表达式
@Before("pointCut_()") 前置通知: 目标方法之前执行
@After("pointCut_()") 后置通知:目标方法之后执行(始终执行)
@AfterReturning("pointCut_()") 返回后通知:执行方法结束前执行 (异常不执行)
@AfterThrowing("pointCut_()") 异常通知: 出现异常时候执行
@Around("pointCut_()") 环绕通知: 环绕目标方法执行
@Component
@Aspect
public class Aop {
@Before("execution(* com.haicao.service.UserService.add(..))")
public void begin() {
System.out.println("前置通知");
}
@After("execution(* com.haicao.service.UserService.add(..))")
public void commit() {
System.out.println("后置通知");
}
@AfterReturning("execution(* com.haicao.service.UserService.add(..))")
public void afterReturning() {
System.out.println("运行通知");
}
@AfterThrowing("execution(* com.haicao.service.UserService.add(..))")
public void afterThrowing() {
System.out.println("异常通知");
}
@Around("execution(* com.haicao.service.UserService.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("我是环绕通知-前");
proceedingJoinPoint.proceed();
System.out.println("我是环绕通知-后");
}
}
XML 方式实现 AOP 编程
1) 引入 jar 文件 【aop 相关 jar, 4 个】
2) 引入 aop 名称空间
3)aop 配置
* 配置切面类 (重复执行代码形成的类)
* aop 配置
拦截哪些方法 / 拦截到方法后应用通知代码
<beansxmlns="http://www.springframework.org/schema/beans"
.........
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--dao实例-->
<beanid="userDao"class="com.haicao.UserDao"></bean>
<beanid="orderDao"class="com.haicao.OrderDao"></bean>
<!--切面类-->
<beanid="aop"class="com.haicao.Aop"></bean>
<!--Aop配置-->
<aop:config>
<!--定义一个切入点表达式:拦截哪些方法-->
<aop:pointcutexpression="execution(*com.haicao.*.*(..))"id="pt"/><!--切面-->
<aop:aspectref="aop">
<!--环绕通知-->
<aop:aroundmethod="around"pointcut-ref="pt"/>
<!--前置通知:在目标方法调用前执行-->
<aop:beforemethod="begin"pointcut-ref="pt"/>
<!--后置通知:-->
<aop:aftermethod="after"pointcut-ref="pt"/>
<!--返回后通知-->
<aop:after-returningmethod="afterReturning"pointcut-ref="pt"/>
<!--异常通知-->
<aop:after-throwingmethod="afterThrowing"pointcut-ref="pt"/>
</aop:aspect>
</aop:config>
</beans>