介绍
AOP
中,使用 Advice
(通知)来实现被代理类的功能,使用代理模式,代理类在方法中通过执行拦截器,实现面向切面编程。
举个例子 前置处理 备注:源代码中省去了一些代码
public interface Advice {
}
|
public interface BeforeAdvice extends Advice {
}
|
public interface Advisor { Advice getAdvice(); }
|
public interface MethodBeforeAdvice extends BeforeAdvice { void before(Method method, Object[] args, @Nullable Object target) throws Throwable; }
|
实现Advisor
接口的子类适配,获取 Advice
通知
class MethodBeforeAdviceAdapter implements AdvisorAdapter {
@Override public MethodInterceptor getInterceptor(Advisor advisor) { MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice(); return new MethodBeforeAdviceInterceptor(advice); }
}
|
通过 MethodBeforeAdviceInterceptor
类 ,调用了 before
方法,实现方法前拦截
public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice { @Override public Object invoke(MethodInvocation mi) throws Throwable { this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis()); return mi.proceed(); }
}
|
查看源代码before
最终调用的是 Method
类的 invoke
方法
public Object invoke(Object obj, Object... args) { MethodAccessor ma = methodAccessor; return ma.invoke(obj, args); }
|
通知通过代码如何实现AOP
举例 spring AOP
JDK
动态代理方式的实现
- 配置
MethodBeforeAdvice
的实现类
JDK
通过实现接口的方式实现动态代理,那么定义一个接口
- 编写接口实现类
- 配置代理类,通过
ProxyFactoryBean
生成需要的
- 拦截器(这里举例的是前置通知
MethodBeforeAdvice
的实现类)
- 代理接口(
JDK
通过实现接口的方式实现动态代理,定义的接口)
- 目标对象(接口实现类)
public class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean<Object>, BeanClassLoaderAware, BeanFactoryAware { public void setInterceptorNames(String... interceptorNames) { super.setInterceptorNames(interceptorNames); } public void setProxyInterfaces(Class<?>[] proxyInterfaces) throws ClassNotFoundException { super.setProxyInterfaces(proxyInterfaces); } public void setTargetName(String targetName) { super.setTargetName(targetName); } }
|