知识点七:Spring AOP技术

本文介绍Spring框架中的两种AOP实现方式:基于XML配置与基于注解。重点展示基于注解方式的AOP开发,包括切面、切入点和通知的定义与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring提供了两种切面使用方式,实际工作中我们可以选用其中一种:
1 基于xml配置方式进行AOP开发
2 基于注解方式进行AOP开发


下面是基于注解的方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<aop:aspectj-autoproxy/><!-- 启动对@AspectJ注解的支持 -->
</beans>


//@Aspect 表示此类是一个切面,包含切入点和通知
//@Component 表示将此切面交由spring容器管理,此时必须在配置文件里面开启自动扫描
// 开启自动扫描 <context:component-scan base-package="cn.itcast"/>
@Aspect @Component
public class MyInterceptor {
//(1) 切入点的描述
/**
*@Pointcut :表示规定切入点
*execution() 语法规范
* 第一个“*”表示任意返回结果类型
* “cn.itcast.service.impl.PersonServiceBean”:表示对此类进行拦截,
* 如果是cn.itcast.service..*.*:表示对包cn.itcast.service以及子包里所
有的类的所有方法进行拦截,
* (..)表示参数
*/
@Pointcut("execution(*
cn.itcast.service.impl.PersonServiceBean.*(..))")
//(2)声明一个切入点
public void anyMethod(){}

//(3) 声明通知及注入方式
@Before("anyMethod()")
public void doAccessCheck(){
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("后置通知");
}
@After("anyMethod()")
public void doAfter(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void doAfterThrowing(){
System.out.println("异常通知");
}
@Around("anyMethod()") //环绕通知的方法签名是规定的!!!
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
//if(){适合判断用户权限
System.out.println("进入方法");
Object result = pjp.proceed();
System.out.println("退出方法");
//}
return result;
}
}


注册给容器后,如果执行此切面规定拦截的类的方法时,按照@Before等方式加上“通知”

得到的运行结果!!!!!一定注意顺序
前置通知
进入方法
我是save()方法
后置通知
最终通知
退出方法
―――――――――――
如果想在通知中得到拦截方法的参数,该怎么做?
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println("前置通知");
}
注意:通知方法的参数名一定要和args指定的一致!!!

如果想得到拦截方法的返回结果,该怎么做?


@AfterReturning(pointcut="anyMethod()",returning="result")
public void doAfterReturning(String result){
System.out.println("后置通知:"+result);
}



如果想得到拦截方法抛出的异常,该怎么做?


@AfterThrowing(pointcut="anyMethod()",throwing="e")
public void doAfterThrowing(Exception e){
System.out.println("异常通知:"+e);
}


基于xml配置方式进行AOP开发

<aop:config>
<aop:aspect id="asp" ref="myInterceptor">
<aop:pointcut id="mycut"
expression="execution(* cn.itcast.service..*.*(..))"/>
<aop:before pointcut-ref="mycut" method="doAccessCheck"/>
<aop:after pointcut-ref="mycut" method="doAfterReturning"/>
<aop:after-returning pointcut-ref="mycut" method="doAfter"/>
<aop:after-throwing
pointcut-ref="mycut" method="doAfterThrowing"/>
<aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
</aop:aspect>
</aop:config>

如果只是拦截返回值为String类型的方法,切面可以这样写
<aop:pointcut id="mycut" expression="execution(java.lang.String
cn.itcast.service..*.*(..))"/>
如果要求第一个参数为String类型,不管其后面有几个参数
<aop:pointcut id="mycut" expression="execution(*
cn.itcast.service..*.*(java.lang.String,..))"/>
如果要求返回值类型不为void,怎么写?
<aop:pointcut id="mycut" expression="execution(!void
cn.itcast.service..*.*(..))"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值