课程概要:
- Spring AOP的基本概念
- Spring AOP的增强类型
- Spring AOP的前置增强
- Spring AOP的后置增强
- Spring AOP的环绕增强
- Spring AOP的异常抛出增强
- Spring AOP的引介增强
一.Spring AOP
增强
的基本概念
Spring当中的专业术语-advice,翻译成中文就是增强的意思。
所谓增强,其实就是向各个程序内部注入一些逻辑代码从而增强原有程序的功能。
二.Spring AOP的增强类型
首先先了解一下增强接口的继承关系
如上图所示:
其中带Spring标志的是Spring定义的扩展增强接口
其中带aopalliance标志的是AOP联盟所定义的接口
按照增加在目标类方法连接点的位置可以将增强划分为以下五类:
- 前置增强 (org.springframework.aop.BeforeAdvice) 表示在目标方法执行前来实施增强
- 后置增强 (org.springframework.aop.AfterReturningAdvice) 表示在目标方法执行后来实施增强
- 环绕增强 (org.aopalliance.intercept.MethodInterceptor) 表示在目标方法执行前后同时实施增强
- 异常抛出增强 (org.springframework.aop.ThrowsAdvice) 表示在目标方法抛出异常后来实施增强
- 引介增强 (org.springframework.aop.introductioninterceptor) 表示在目标类中添加一些新的方法和属性
其中,引介增强是一种特殊的增强。他可以在目标类中添加属性和方法,通过拦截定义一个接口,让目标代理实现这个接口。他的连接点是类级别的,而前面的几种则是方法级别的。
其中,环绕增强是AOP联盟定义的接口,其他四种增强接口则是Spring定义的接口。
其实,AOP增强很简单:
通过实现这些增强接口,在实现这些接口的方法当中定义横切逻辑,然后通过配置Spring的配置文件就可以完成将增强织入到目标方法当中了。
补充:增强既包含了横切逻辑同时又包含了部分连接点信息。
三.Spring AOP的前置增强
1.通过代码实现增强
在Spring当中,仅支持方法级别的增强,利用MethodBeforeAdvice实现,表示在目标方法执行前实施增强。
示例演示:
对服务生的服务用语进行强制规范。我们假设服务生只需要干两件事情:1.欢迎顾客 2.对顾客提供服务
那么我们创建的示例代码的主要步骤如下:
- 创建业务接口类:Waiter.java
- 创建业务实现类:NativeWaiter.java
- 创建业务增强类:GreetingBeforeAdvice.java
- 创建增强测试类:TestAdvice.java
接下来我们分别在IDEA中创建相应的类。
服务生接口Waiter.java
public interface Waiter {
void greetTo(String name);
void serverTo(String name);
}
服务生实现类NativeWaiter.java
public class NativeWaiter implements Waiter{
public void greetTo(String name) {
System.out.println("greet to"+name+"...");
}
public void serverTo(String name) {
System.out.println("serving"+name+"...");
}
}
服务生业务增强类GreetingBeforeAdvice.java
public class GreetingBeforeAdvice implements MethodBeforeAdvice{
/**
* 前置增强方法
* 当该方法发生异常时,将阻止目标方法的执行
* @param method 目标类方法
* @param objects 目标类方法入参
* @param o 目标类对象实例
* @throws Throwable
*/
public void before(Method method, Object[] objects, Object o) throws Throwable {
String clientName=(String)objects[0];
System.out.println("How Are You! mr."+clientName);
}
}
增强测试类TestBeforeAdvice.java
public class TestBeforeAdvice {
public static void main(String[] args){
//创建目标对象
Waiter target=new NativeWaiter();
//创建增强类对象
BeforeAdvice advice=new GreetingBeforeAdvice();
//创建代理工厂对象
ProxyFactory factory=new ProxyFactory();
//设置代理类
factory.setTarget(target);
//添加增强类
factory.addAdvice(advice);
//获取代理类
Waiter proxy=(Waiter)factory.getProxy();
//调用目标类方法
proxy.greetTo("icarus");
proxy.serverTo("icarus");
}
}
程序运行结果:
How Are You! mr.icarus
greet toicarus...