交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
aop第5 章:ProxyFactory
分享
未结
0
797
李延
LV6
2021-05-16
悬赏:20积分
# 作用 代理工厂。生成代理对象。 # 继承关系  # 父类说明 - Advised 定义代理类与切面相关接口 - ProxyConfig 代理相关配置 - AdvisedSupport 接口Advised的实现 - ProxyCreatorSuppot 添加listeners,并在代理创建是发送事件 # ProxyFactory ## 构造函数 ```java public ProxyFactory(Object target) { setTarget(target); setInterfaces(ClassUtils.getAllInterfaces(target)); } ``` 我们看到在一方面设置了代理对象,另一方面获取代理对象的所有父接口 ## getProxy 在解析AnnotationAwareAspectJAutoProxyCreator时,我们看到就是调用当前方法生成的代理对象。代码如下: ```java public Object getProxy() { return createAopProxy().getProxy(); } ``` ```java protected final synchronized AopProxy createAopProxy() { //第一次创建,触发激活事件 if (!this.active) { activate(); } //调用createAopProxy方法,创建jdk或cjlib代理 return getAopProxyFactory().createAopProxy(this); } ``` 在ProxyCreatorSupport的构造函数中,设置AopProxyFactory 为DefaultAopProxyFactory ```java public ProxyCreatorSupport() { this.aopProxyFactory = new DefaultAopProxyFactory(); } ``` 我们继续跟进createAopProxy方法 ```java @Override public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (!IN_NATIVE_IMAGE && (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); } } ``` 我们看到 当 isOptimize isProxyTargetClass 和hasNoUserSuppliedProxyInterfaces(没有父接口时)时用的是ObjenesisCglibAopProxy,其他使用JdkDynamicAopProxy 并且还添加了一步判断:当代理对象为接口时,强制使用jdk代理。 那么想要更进一步了解代理就需要了解这两个类。具体见AopProxy
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号