1.什么是AOP:
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2. 什么是目标类,额外功能,代理类?
目标类:就是我们的核心代码,业务逻辑。
额外功能(也就是AOP的功能):日志处理、事务处理、异常处理、性能分析等。
目标类 + 额外功能 = 代理类
3.AOP的原理就是java的动态代理机制。
4.AOP的四种增强方式
(1)配置增强类的bean
<!-- 前置增强功能 -->
<bean id="myBeforeAdvice" class="com.gxy.aop.MyBeforeAdvice"></bean>
<!-- 后置增强 -->
<bean id="myAfterAdvice" class="com.gxy.aop.MyAfterAdvice"></bean>
<!-- 异常增强 -->
<bean id="myThrowsAdvice" class="com.gxy.aop.MyThrowsAdvice"></bean>
<!-- 环绕增强 -->
<bean id="myInterceptor" class="com.gxy.aop.MyInterceptor"></bean>
(2)前置增强,在核心功能之前执行的额外功能
package com.gxy.aop;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
System.out.println("前置增强");
//获取目标方法名称
String method = arg0.getName();
System.out.println("the method:"+method);
//获取目标方法参数的实参列表
for (int i = 0; i < arg1.length; i++) {
System.out.println("the arg1:"+arg1[i]);
}
//获取目标类的类路径
System.out.println("the arg2:"+arg2.getClass());
}
}
(3)后置增强,在核心功能之后执行的额外功能
package com.gxy.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class MyAfterAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
System.out.println("后置增强");
//获取反参参数的类型
System.out.println("the arg0:"+arg0.getClass());
//获取目标方法名称
System.out.println("the arg1:"+arg1.getName());
//获取目标方法参数的实参列表
for (int i = 0; i < arg2.length; i++) {
System.out.println("the arg2:"+arg2[i]);
}
//获取目标类的类路径
System.out.println("the arg3:"+arg3.getClass());
}
}
(4)异常增强,在核心功能发生异常时执行的额外功能
package com.gxy.aop;
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class MyThrowsAdvice implements ThrowsAdvice{
public void afterThrowing(Method method, Object[] args, Object target,Exception ex) throws Throwable {
System.out.println(target+"里面的"+method.getName()+"产生了"+ex.getMessage());
}
}
(5)环绕增强,在核心功能之前以及之后执行的额外功能
package com.gxy.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("环绕增强");
//获取目标实现类对象
String actionClass = arg0.getThis().getClass().toString();
System.out.println("arg0.getThis():"+actionClass);
//获取目标方法名称
String methodName = arg0.getMethod().getName();
System.out.println("arg0.getMethod():"+methodName);
//获取目标方法参数的实参列表
Object[] arg = arg0.getArguments();
for (int i = 0; i < arg.length; i++) {
System.out.println("arg0.getArguments():"+arg[i]);
}
//由于启动了环绕增强,目标类的方法将不会执行,而被.proceed取代,并返回目标类的反参
//执行目标方法
Object object = arg0.proceed();
return object;
}
}
更详细的请点击 谈谈对Spring AOP的理解