面向切面(AOP)之Spring接口方式 schema配置方式 aspectj注解方式
来源:互联网 发布:uber隐瞒数据泄露事件 编辑:程序博客网 时间:2024/05/16 09:44
一、初识AOP
关于AOP的学习可以参看帮助文档: spring-3.2.0.M2\docs\reference\html目录下index.html的相关章节
1、AOP:Aspect-OrientedProgramming。AOP是OOP的补充,是GOF的延续。说到AOP,我们就不得不来提一下软件的纵向和横向问题。从纵向结构来看就是我们软件系统的各个模块,它主要负责处理我们的核心业务(例如商品订购、购物车查看);而从横向结构来看,我们几乎每个系统又包含一些公共模块(例如权限、日志模块等)。这些公共模块分布于我们各个核心业务之中(例如订购和查看商品明细的过程都需要检查用户权限、记录系统日志等)。这样一来不仅在开发过程中要处处关注公共模块的处理而且开发后维护起来也是十分麻烦。而有了AOP之后将应用程序中的商业逻辑同对其提供支持的通用服务进行分离,使得开发人员可以更多的关注核心业务开发。
2、AOP术语
切面(aspect):用来切插业务方法的类。
连接点(joinpoint):是切面类和业务类的连接点,其实就是封装了业务方法的一些基本属性,作为通知的参数来解析。
通知(advice):在切面类中,声明对业务方法做额外处理的方法。
切入点(pointcut):业务类中指定的方法,作为切面切入的点。其实就是指定某个方法作为切面切的地方。
目标对象(target object):被代理对象。
AOP代理(aop proxy):代理对象。
通知:
前置通知(before advice):在切入点之前执行。
后置通知(after returning advice):在切入点执行完成后,执行通知。
环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。
异常通知(after throwing advice):在切入点抛出异常后,执行通知。
AOP是基于代理模式,了解了jdk动态代理和cglib的用法,对我们学习大有裨益。
二、Spring AOP环境
要在项目中使用Spring AOP 则需要在项目中导入除了springjar包之外,还有aspectjrt.jar,aspectjweaver.jar,aopalliance.jar,spring-aop-3.2.0.M2.jar和cglib.jar 。
好了,前提工作准备完成,Spring提供了很多的实现AOP的方式:Spring接口方式,schema配置方式和注解等,好了废话不多说了,开始springaop学习之旅,这篇先以Spring接口的方式学起!
三、Spring接口方式实现AOP步骤
利用Spring AOP接口实现AOP,主要是为了指定自定义通知来供spring AOP机制识别。主要接口:前置通知MethodBeforeAdvice,后置通知:AfterReturningAdvice,环绕通知:MethodInterceptor,异常通知:ThrowsAdvice。见例子代码:
步骤一、业务接口的编写
//代理类接口,也是业务类接口<br>
// 利用接口的方式,spring aop 将默认通过jdk动态代理来实现代理类<br>
// 不利用接口,则spring aop 将通过cglib 来实现代理类
public interface IBaseBusiness {
// 用作代理的切入点方法
public String delete(String obj)
//这方法不被切面切
public String add(String obj);
//这方法切不切呢?可以设置
public String modify(String obj);
}
步骤二、业务类:
//业务类,也是目标对象
public class BaseBusiness implements IBaseBusiness {
//切入点
public String delete(String obj) {
System.out.println("==========调用切入点:" + obj +"说:你敢删除我!===========\n");
return obj + ":瞄~";
}
publicString add(String obj) {
System.out.println("================这个方法不能被切。。。==============\n");
return obj + ":瞄~ 嘿嘿!";
}
publicString modify(String obj) {
System.out.println("=================这个也设置加入切吧====================\n");
return obj + ":瞄改瞄啊!";
}
}
步骤三、通知类:
1、前置通知:
public class BaseBeforeAdvice implements MethodBeforeAdvice {
// method : 切入的方法 <br>
//args :切入方法的参数 <br>
// target :目标对象
@Override
public voidbefore(Method method, Object[] args, Object target) throwsThrowable {
System.out.println("===========进入beforeAdvice()============\n");
System.out.print("准备在" + target + "对象上用");
System.out.print(method + "方法进行对 '");
System.out.print(args[0] + "'进行删除!\n\n");
System.out.println("要进入切入点方法了 \n");
}
}
2、后置通知:
public class BaseAfterReturnAdvice implements AfterReturningAdvice{
//returnValue :切入点执行完方法的返回值,但不能修改<br>
// method :切入点方法 <br>
// args:切入点方法的参数数组 <br>
// target :目标对象
@Override
public voidafterReturning(Object returnValue, Method method, Object[] args,Object target) throws Throwable {
System.out.println("==========进入afterReturning()===========\n");
System.out.println("切入点方法执行完了 \n");
System.out.print(args[0] + "在");
System.out.print(target + "对象上被");
System.out.print(method + "方法删除了");
System.out.print("只留下:" + returnValue + "\n\n");
}
}
3、环绕通知:
public class BaseAroundAdvice implements MethodInterceptor {
// invocation :连接点
@Override
publicObject invoke(MethodInvocation invocation) throws Throwable {
System.out.println("===========进入around环绕方法!=========== \n");
// 调用目标方法之前执行的动作
System.out.println("调用方法之前: 执行!\n");
// 调用方法的参数
连接点(joinpoint):是切面类和业务类的连接点,其实就是封装了业务方法的一些基本属性,作为通知的参数来解析。
通知(advice):在切面类中,声明对业务方法做额外处理的方法。
切入点(pointcut):业务类中指定的方法,作为切面切入的点。其实就是指定某个方法作为切面切的地方。
目标对象(target object):被代理对象。
AOP代理(aop proxy):代理对象。
通知:
前置通知(before advice):在切入点之前执行。
后置通知(after returning advice):在切入点执行完成后,执行通知。
环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。
异常通知(after throwing advice):在切入点抛出异常后,执行通知。
二、Spring AOP环境
要在项目中使用Spring AOP 则需要在项目中导入除了springjar包之外,还有aspectjrt.jar,aspectjweaver.jar,aopalliance.jar,spring-aop-3.2.0.M2.jar和cglib.jar 。
三、Spring接口方式实现AOP步骤
步骤一、业务接口的编写
public interface IBaseBusiness {
}
步骤二、业务类:
public class BaseBusiness implements IBaseBusiness {
}
步骤三、通知类:
public class BaseBeforeAdvice implements MethodBeforeAdvice {
}
public class BaseAfterReturnAdvice implements AfterReturningAdvice{
}
public class BaseAroundAdvice implements MethodInterceptor {