SpringAOP的前置知识点如下文章
Spring AOP 前置知识链接
目标代理对象的创建
Spring创建目标代理对象的方式如下
- JDK动态代理
- CGLIB
- ObjenesisCglibAopProxy(Spring 4.0开始引入,默认方式)
JDK动态代理
jdk代理源码
org.springframework.aop.framework.JdkDynamicAopProxy#getProxy(java.lang.ClassLoader)
@Override
public Object getProxy(@Nullable ClassLoader classLoader) {
if (logger.isTraceEnabled()) {
logger.trace("Creating JDK dynamic proxy: " + this.advised.getTargetSource());
}
Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
}
org.springframework.aop.framework.DefaultAopProxyFactory 创建代理的源码如下
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
CGLIB代理
org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)
AOP的代理模式
Spring AOP拦截是通过动态代理方式来实现的
动态代理本身是实现了InvocationHandler接口的,因为此是通过invoke方法来实现的