注解定义切面
在执行初始化方法之后
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文件
在 \java\jdk\lib 文件下cmd命令下执行
java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
请搜索 HSDB查看代理对象