Spring的API实现AOP功能
1、这是Spring1.2的历史用法,现在Spring4.0仍然支持。
2、这是SpringAOP的基础
使用Spring的API实现AOP的原因:Schema-based(配置文件)和AspectJ实现AOP完全可以满足我们使用AOP的功能,使用API是因为这是SpringAOP的基础,可以加深我们应用和了解SpringAOP的理解(无论是注解方式、还是XML配置文件的方式,最终实现的基础都是和API密切关系的)。
3、现在SpringAOP的用法也是基于历史的,只是更简便了(在Spring1.2时配置文件很多,还需要了解各种配置)。
Spring的API
一、Pointcut(作为一个接口,有几个实现类)
1、Pointcut接口的实现类之一:NameMatchMethodPointcut,根据方法名字进行匹配。
2、该类有一个成员变量:mappedNames(它是一个集合,存放用于匹配的方法的名称),匹配方法的集合。
配置文件的例子:(sa开头的所有方法进行切入)
二、Before advice(原理:单独写一个前置通知的类,并实现MethodBeforeAdvice接口,并实现该接口的方法,)
1、一个简单的通知类型。
2、执行逻辑方法前被调用,不需要MethodInvocation对象。
3、前置通知可以在连接点执行之前插入自定义行为,但不能改变返回值。
案例:(会使用到后面的知识,暂时编写这些)
public class MoocBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] object, Object target) throws Throwable {
System.out.println("前置通知的方法:" + method.getName() + " " + target.getClass().getName());
}
}
三、Throws advice
1、如果连接点(执行的业务方法)出现异常,throws advice在方法返回后被调用。
2、如果throws-advice的方法抛出异常,那么它将覆盖原有异常。
3、接口org.springframework.aop.ThrowAdvice不包含任何方法,仅仅是一个声明,其实现类一定要实现类似这样的方法,void afterThrowing([Method, args, target],ThrowableSubclass);
Throws advice发生异常的说明
public void afterThrowing(Exception ex);//只有一个异常。
public void afterThrowing(RemoteException ex);//另外一种类型的异常。
public void afterThrowing(Method method,Object[] args(目标参数),Object target(对象),Exception ex);
public void afterThrowing(Method method,Object[] args(目标参数),Object target(对象),ServletException ex(其他类型的异常));
结论:异常通知(如上)方法参数里必须有异常,其他参数可有可无的。
抛出异常通知案例:
public class MoocThrowsAdvice implements ThrowsAdvice{
public void afterThrows(Exception ex){
System.out.println("抛出异常通知执行了");
}
public void afterThrows(Method method,Object[] object,Object target,Exception ex){
System.out.println("抛出异常通知执行了");
}
}
四、After Returning advice
1、返回后通知必须实现org.springframework.aop.AfterReturningAdvice接口(它和基于配置文件的配置方式是一样的)
2、可以访问返回值(但不能修改返回值)、被调用的方法、方法的参数和目标。
3、如果抛出异常,将会抛出拦截器链,替代返回值。
返回后通知案例
public class MoocAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("返回后通知方法执行了"+method.getName()+" "+target.getClass().getName()+" "+returnValue);
}
}
五、Interception around advice(环绕通知)
1、Spring的切入点模型使得切入点可以独立与advice重用,以针对不同的advice可以使用相同的切入点(和之前基于XML配置文件的AOP实现方式是一样的,切入点可以放在外面单独地去定义,通过Point reference,在每一个业务逻辑方法中都可以引用相同的切入点,当然,每个Advice也可以定义自己的Point cut)。
案例:
public class MoocMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object obj = null;
System.out.println("环绕前通知实现了");
obj = invocation.proceed();
System.out.println("环绕后通知实现了");
return null;
}
}
六、Introduction advice(和XML配置中的Introduction advice一样的功能)
1、Spring把引入通知作为一种特殊的拦截通知。
2、如果使用API实现AOP,则需要IntroductionAdvisor和IntroductionInterceptor这两个接口。
3、Introduction advice仅适用于类,不能和任何其它切入点一起使用。
如下为基于XML配置的Introduction advice内容
一个Spring test suite的例子
1、如果调用lock()方法,希望所有的setter方法抛出LockedException异常(使用场景:如使物体不可变,AOP典型例子)
2、需要完成繁重任务的IntroductionInterceptor,不是去实现该接口,而是使用org.springframework.aop.support.DelegatingIntroductionInterceptor
Advisor API in Spring
Advisor是仅包含一个切入点表达式关联的单个通知的方面
除了introductions,Advisor可以用于任何通知
org.springframework.aop.support.DefaultPointcutAdvisor是最常用的advisor类,他可以与MethodInterceptor,BeforeAdvice或者ThrowsAdvice一起使用
他可以混合在Spring同一个AOP代理的advisor和advice
Introduction advice
一个Spring test suite的例子
如果调用lock方法,希望所有的setter方法抛出LockedException异常
需要一个完成繁重任务的IntroductionInterceptor,这种情况下,可以使用org.springframework.aop.support.DelegatingIntroductionInterceptor
Introduction advice
Spring把引入通知作为一种特殊的拦截通知
需要IntroductionAdvisor和IntroductionInterceptor
仅适用于类,不能和任何切入点一起使用
Interception around advice
环绕advice 拦截器
Spring的切入点模型使得切入点可以独立与advice重用,以针对不同的advice可以使用相同的切入点
After Returning advice
后置通知必须实现prg.springframework.aop.AfterReturningAdvice接口
可以访问返回值(但不能进行修改)、被调用的方法、方法的参数和目标
如果抛出异常,将会抛出拦截器链,替代返回值
Throws advice
如果连接点抛出异常,throws advice在连接点返回后被调用
如果throws-advice的方法抛出异常,name它将覆盖原有异常(原有异常是指业务方法的异常)
接口org.apringframework.aop.ThrowsAdvice 不包含任何方法,仅仅是一个声明,实现类需要实现类似下面的方法
void afterThrowing([Method, args,target], ThrowableSubclass);
Before advice
一个简单的通知类型
只是在进入方法之前被调用,不需要MethodInvocation对象
前置通知可以在连接点执行之前插入自定义行为,但不能改变返回值
spring AOP API
pointcut
实现之一:NameMatchMethodPointcut,根据方法名字进行匹配
成员变量:mappedNames,匹配的方法名集合
Pointcut
Spring的API实现AOP功能
1、这是Spring1.2的历史用法,现在Spring4.0仍然支持。
2、这是SpringAOP的基础
使用Spring的API实现AOP的原因:Schema-based(配置文件)和AspectJ实现AOP完全可以满足我们使用AOP的功能,使用API是因为这是SpringAOP的基础,可以加深我们应用和了解SpringAOP的理解(无论是注解方式、还是XML配置文件的方式,最终实现的基础都是和API密切关系的)。
3、现在SpringAOP的用法也是基于历史的,只是更简便了(在Spring1.2时配置文件很多,还需要了解各种配置)。
Spring的API
一、Pointcut(作为一个接口,有几个实现类)
1、Pointcut接口的实现类之一:NameMatchMethodPointcut,根据方法名字进行匹配。
2、该类有一个成员变量:mappedNames(它是一个集合,存放用于匹配的方法的名称),匹配方法的集合。
配置文件的例子:(sa开头的所有方法进行切入)
二、Before advice(原理:单独写一个前置通知的类,并实现MethodBeforeAdvice接口,并实现该接口的方法,)
1、一个简单的通知类型。
2、执行逻辑方法前被调用,不需要MethodInvocation对象。
3、前置通知可以在连接点执行之前插入自定义行为,但不能改变返回值。
案例:(会使用到后面的知识,暂时编写这些)
public class MoocBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] object, Object target) throws Throwable {
System.out.println("前置通知的方法:" + method.getName() + " " + target.getClass().getName());
}
}
三、Throws advice
1、如果连接点(执行的业务方法)出现异常,throws advice在方法返回后被调用。
2、如果throws-advice的方法抛出异常,那么它将覆盖原有异常。
3、接口org.springframework.aop.ThrowAdvice不包含任何方法,仅仅是一个声明,其实现类一定要实现类似这样的方法,void afterThrowing([Method, args, target],ThrowableSubclass);
Throws advice发生异常的说明
public void afterThrowing(Exception ex);//只有一个异常。
public void afterThrowing(RemoteException ex);//另外一种类型的异常。
public void afterThrowing(Method method,Object[] args(目标参数),Object target(对象),Exception ex);
public void afterThrowing(Method method,Object[] args(目标参数),Object target(对象),ServletException ex(其他类型的异常));
结论:异常通知(如上)方法参数里必须有异常,其他参数可有可无的。
抛出异常通知案例:
public class MoocThrowsAdvice implements ThrowsAdvice{
public void afterThrows(Exception ex){
System.out.println("抛出异常通知执行了");
}
public void afterThrows(Method method,Object[] object,Object target,Exception ex){
System.out.println("抛出异常通知执行了");
}
}
四、After Returning advice
1、返回后通知必须实现org.springframework.aop.AfterReturningAdvice接口(它和基于配置文件的配置方式是一样的)
2、可以访问返回值(但不能修改返回值)、被调用的方法、方法的参数和目标。
3、如果抛出异常,将会抛出拦截器链,替代返回值。
返回后通知案例
public class MoocAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("返回后通知方法执行了"+method.getName()+" "+target.getClass().getName()+" "+returnValue);
}
}
五、Interception around advice(环绕通知)
1、Spring的切入点模型使得切入点可以独立与advice重用,以针对不同的advice可以使用相同的切入点(和之前基于XML配置文件的AOP实现方式是一样的,切入点可以放在外面单独地去定义,通过Point reference,在每一个业务逻辑方法中都可以引用相同的切入点,当然,每个Advice也可以定义自己的Point cut)。
案例:
public class MoocMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object obj = null;
System.out.println("环绕前通知实现了");
obj = invocation.proceed();
System.out.println("环绕后通知实现了");
return null;
}
}
六、Introduction advice(和XML配置中的Introduction advice一样的功能)
1、Spring把引入通知作为一种特殊的拦截通知。
2、如果使用API实现AOP,则需要IntroductionAdvisor和IntroductionInterceptor这两个接口。
3、Introduction advice仅适用于类,不能和任何其它切入点一起使用。
如下为基于XML配置的Introduction advice内容
一个Spring test suite的例子
1、如果调用lock()方法,希望所有的setter方法抛出LockedException异常(使用场景:如使物体不可变,AOP典型例子)
2、需要完成繁重任务的IntroductionInterceptor,不是去实现该接口,而是使用org.springframework.aop.support.DelegatingIntroductionInterceptor
throws方法抛出异常,会覆盖原有异常
Advisor API in Spring
Spring AOP introduction advisor
Spring AOP introduction advice
Spring AOP introduction advice
Spring AOP introduction advice
Spring AOP interception around advice
Spring AOP after returning advice
Spring AOP throw advice
Spring AOP throw advice
Spring AOP before advice
SpringAOP pointcut
throws-advice 接口中没有定义函数,但是在实现类中必须实现类似本页中的实现。
此段代码定义了一个bean,这个bean可以被自动加载,mappedNames属性被自动赋值。
后面的作用不太理解?
方法的名称中包含set
映射的方法是sa开头的所有方法
<value>sa*</value>
Introduction advice:
Interception around advice:
After Returning advice: