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>
注册给容器后,如果执行此切面规定拦截的类的方法时,按照@Before等方式加上“通知”
得到的运行结果!!!!!一定注意顺序
前置通知
进入方法
我是save()方法
后置通知
最终通知
退出方法
―――――――――――
如果想在通知中得到拦截方法的参数,该怎么做?
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println("前置通知");
}
注意:通知方法的参数名一定要和args指定的一致!!!
如果想得到拦截方法的返回结果,该怎么做?
如果想得到拦截方法抛出的异常,该怎么做?
基于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..*.*(..))"/>
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..*.*(..))"/>