文档章节

BeanNameAutoProxy补充说明[重要]

重城重楼
 重城重楼
发布于 2016/09/09 10:55
字数 521
阅读 15
收藏 0

BeanNameAutoProxyCreator 实际上是通过为目标bean创建代理类然后为其织入advice实现的自动代理

 

     如此就引发一个问题:当使用BeanNameAutoProxyCreator为controller实现自动代理并拦截对应方法后  

     会影响到controller本身,servlet在为controller创建映射关系时因为代理类的干扰而映射失败,导致访问对应的url时报404错误

    解决方案:super.setOptimize(true);设置为最优使用cglib代理

    原理分析:optimize默认是false,使用jdk动态代理。

             1-1、JDK动态代理只能针对实现了接口的类生成代理,此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。

            1-2、CGLIB代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的(利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理)

            1-3、DefaultAopProxyFactory创建代理代码如下

 public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (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()) {
                return new JdkDynamicAopProxy(config);
            }
            return CglibProxyFactory.createCglibProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

 

     2、servletDispatcher 分配url时

AbstractHandlerMethodMapping.initHandlerMethods方法判断对应controller是否需要映射时就会出问题了。

    2-1、因为jdk动态代理已经是一个$proxy类来代替controller了,所有获取其注解@controller和@requestMapping时会获取不到,从而么有映射map关系,url访问时就会报404了

initHandlerMethods方法关键代码:

for (String beanName : beanNames) {
            if (isHandler(getApplicationContext().getType(beanName))){
                detectHandlerMethods(beanName);
            }
        }

isHandler方法关键代码:

protected boolean isHandler(Class<?> beanType) {
        return ((AnnotationUtils.findAnnotation(beanType, Controller.class) != null) ||
                (AnnotationUtils.findAnnotation(beanType, RequestMapping.class) != null));
    }

此时的beanType是$proxy类,已经获取不到对应的注解了

© 著作权归作者所有

上一篇: spring定时任务
下一篇: BeanNameAutoProxy1
重城重楼
粉丝 4
博文 55
码字总数 39393
作品 0
南京
程序员
私信 提问
5.5 Spring事务支持

声明式事务管理的配置方式,通常有以下4种: ① 使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。 ② 采用Bean继承的事务...

JerryPan
2016/03/08
148
0
如何使用Mock/Stub模拟对象来对FeignClient进行单元测试(UnitTest)

前言 在搜索引擎使用关键词mock+feignclient搜索,搜索结果中最相关的就是StackOverFlow上的《How to mock feign.Client.Default with Mockito》了。 本文将会基于此问答中,用户yuz的回答展...

三汪
2017/11/16
0
0
Redis 3.2.7 发布,多处安全修复

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP...

mj0011
2017/02/01
839
2
Redis 4.0.2 和 3.2.11 发布,修复了隐藏的重要错误

Redis 4.0.2 和 3.2.11 已发布。发布说明显示,本次属于紧急更新,两个版本都修复了隐藏的重要错误。建议升级。 详情请参阅: Redis 4.0.2 发布说明:https://raw.githubusercontent.com/ant...

淡漠悠然
2017/09/22
1K
2
Redis 4.0.9 发布,修复关于 AOF 严重的 bug 和新增功能

Redis 4.0.9 已发布,发布说明显示,该版本新增了一些有趣的功能,也修复了重要的关于 AOF 的 bug。 关于修复 AOF 严重的 bug 的详细描述请查看更新说明。 其他更新 Bug 修复 Latency monito...

淡漠悠然
2018/03/30
2K
6

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.3K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
39
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部