栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring5.2.9 aop cjlb 代理过程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring5.2.9 aop cjlb 代理过程

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353406.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号