注解定义切面 在执行初始化方法之后 AnnotationAwareAspectJAutoProxyCreator -> AbstractAutoProxyCreator.postProcessAfterInitialization .wrapIfNecessary .getAdvicesAndAdvisorsForBean(从这你判断是不是 需要代理进入 下面的.createProxy) .findEligibleAdvisors(得到满足的Advisors) .findCandidateAdvisors(得到所有的Advisors) super.findCandidateAdvisors(得到系统的Advisors)(得到所有的 Advisor.class 的bean) this.aspectJAdvisorsBuilder.buildAspectJAdvisors(得到自己定义的@Aspect注解bean)==BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors ReflectiveAspectJAdvisorFactory.getAdvisors(得到自己定义的@Aspect注解bean下面的 代理方法通知) .getAdvisor(根据@Before,@After,@Around得到不同的通知包装兑象) .getPointcut(得到切点) new InstantiationModelAwarePointcutAdvisorImpl(方法的包装对象) .findAdvisorsThatCanApply(得到满足的Advisors) AopUtils.findAdvisorsThatCanApply(拿到所有的Advisors去判断这个类的某一个方法是不是要被代理代理了就加入) .createProxy proxyFactory.addAdvisors(advisors)(我们的上面得到的 Advisors放入工厂) this.advisors.add(advisor); proxyFactory.setTargetSource(targetSource);targetSource就是没有代理的对象 就是 原对象 proxyFactory.getProxy .createAopProxy() .getAopProxyFactory(得到了DefaultAopProxyFactory工厂) .createAopProxy(this); return new ObjenesisCglibAopProxy(config);config就是上面的proxyFactory 就是下面的 this.advised ObjenesisCglibAopProxy.getProxy .getCallbacks new DynamicAdvisedInterceptor(this.advised)(这个兑象 就有代理所有方法) 还有别的对象 .createProxyClassAndInstance enhancer.createClass(得到代理后的class对象)==Enhancer.createClass createHelper super.create== AbstractClassGenerator.create data.get(去创建class对象) generatedClasses.get() objenesis.newInstance(得到代理后对象) ((Factory) proxyInstance).setCallbacks(callbacks)(把callbacks(代理执行的方法的对象设置进代理对象中,在执行代理时执行))
在bean执行初始化方法后,调用AnnotationAwareAspectJAutoProxyCreator 实现 BPP
调用 postProcessAfterInitialization方法来完成代理,
代理后的代码
public final String toString() {
MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
if (var10000 == null) {
CGLIB$BIND_CALLBACKS(this);
var10000 = this.CGLIB$CALLBACK_0;
}
return var10000 != null ? (String)var10000.intercept(this, CGLIB$toString$5$Method, CGLIB$emptyArgs, CGLIB$toString$5$Proxy) : super.toString();
}
这里的 CGLIB$CALLBACK_0就是上面的
new DynamicAdvisedInterceptor(this.advised) 对象
这个方法拦截了 所有的代理
其中的 this.advised 为包含 Advisor 类的集合
Advisor 的 getAdvice 方法 获取 真正的 代理执行
查看jvm中生成的代理的 .class文件
在 javajdklib 文件下cmd命令下执行
java -cp .sa-jdi.jar sun.jvm.hotspot.HSDB
请搜索 HSDB查看代理对象



