spring5.2.9 aop cglb 代理过程

注解定义切面
在执行初始化方法之后
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查看代理对象

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值