[拦截器]关于拦截方法调用其他内部方法无法被拦截问题的解决

news/2025/2/9 1:20:16 标签: spring, bean, aop, idea, class, java
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

拦截器的实现原理很简单,就是动态代理,实现AOP机制。当外部调用被拦截class="tags" href="/tags/BEAN.html" title=bean>bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作。但是如果现在一个需求是,当外部调用拦截class="tags" href="/tags/BEAN.html" title=bean>bean的时候,不但要执行拦截当前方法,如果当前方法内部同时调用了其他内部方法,也要被拦截。按照目前的拦截器实现逻辑,是无法拦截当前方法内部调用的方法的,这样说有点抽象,看一个代码:

 

当外部调用class="tags" href="/tags/BEAN.html" title=bean>beanA.method1();的时候,拦截器执行拦截逻辑,执行完毕后进入method1方法执行,当调用method2的时候,拦截器是否会再次拦截?是不会的,这里涉及到拦截器的一个原理,拦截器涉及两个对象,代理对象和原始对象,拦截器所执行的代理对象执行完毕后,当执行method1即进入了原始对象,那么在原始对象中调用method2,是无法进行拦截的。所以很显眼,这样无法满足我们的需求。

class="tags" href="/tags/SPRING.html" title=spring>spring的源代码中通过一个增强对象的检查,控制了当前的内部调用是否使用代理来执行,这让人感到无奈。class="tags" href="/tags/SPRING.html" title=spring>spring的作者们很隐晦的提出避免内部调用的方法。

我们可能会想,在外部调用两次class="tags" href="/tags/BEAN.html" title=bean>beanA,第一次调用method1,第二次调用method2,这样做可以解决问题,但是这样的直接后果是我们的逻辑代码将变得紊乱,并非所有的场景下都可以通过这样的设计来完成。虽然这是class="tags" href="/tags/SPRING.html" title=spring>spring官方推荐的避免内部调用的class="tags" href="/tags/IDEA.html" title=idea>idea。

查看了相关资料,得到了一种方法,即在method1的内部,通过直接获取当前代理对象的方式然后通过代理对象调用method2,这样触发拦截。

看看代码:

 

我们显示的调用了AopContext来获取当前代理对象,然后调用其方法,这样做还必须的一个步骤是将当前的代理暴露给线程使用,在配置文件中需要配置一个参数:

 

它是ProxyConfig的一个参数,默认是false,如果不设置这个参数,那么上述java代码将无法获取当前线程中的代理对象。

这种方法可以成功触发拦截,但是也带来了其他问题,比如代码的织入,我们的代码将变得复杂而且晦涩,而且严格要求系统针对于当前的class="tags" href="/tags/BEAN.html" title=bean>bean必须配置拦截器,否则会因为找不到拦截器而抛出异常。

这样做有什么负面影响?对事务的影响,对安全的影响,现在不得而知,还需要逐步去测试以尝试。


http://www.niftyadmin.cn/n/1639120.html

相关文章

使用Logstash来实时同步MySQL数据到ES

本篇我们来实战从MYSQL里直接同步数据 一、首先下载和你的ES对应的logstash版本,本篇我们使用的都是6.1.1 下载后使用logstash-plugin install logstash-input-jdbc 命令安装jdbc的数据连接插件 二、新增mysqltoes.conf文件,配置Input和output参数如下&…

[lucene第三季]Lucene那点事儿-总结篇

前面两篇文章,简单尝试了lucene的一些应用,还是再回头想想我们的需求吧,我们希望能够开发一个淘宝一样的针对商品的搜索服务,提供多种条件的组合搜索,并且对于性能提出了一定的要求。同时我们希望这个小型的搜索引擎具…

CentOS7下安装部署ES及head插件安装

1.新建一个用户elasticsearch,当然也可以不创建用户,直接用系统用户来安装和运行elasticserach [rootlocalhost ~]#useradd elasticsearch 接下来修改系统配置,这里不修改的话es运行会报错: max file descriptors [4096] for elasticsearch process is too low,…

[lucene那点事儿]想说爱你很容易

内容提要: ---------------------目录开始-------------------- 1、索引精确刷新问题 2、利用缓存提高索引批量更新拦截器的性能 3、针对不同的数据来源建立不同的索引并分域存放 4、引入xml配置文件的方式实现索引建立的动态配置 5、单值搜索、组合条件搜索等…

[lucene异常]why am I getting a TooManyClause exception

异常情况: org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024 at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:165) at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:156) at org.apache.…

[小插曲]Eclipse设置高亮显示

在eclipse中使用快捷键,不小心按错了,使得变量的高亮显示没了。 其恢复方式如下: 选择:windows-> preferences->java->Editor->Mark Occurences 选择最上的复选框,下面的就有很多了。 其中的Local variables就是变…

springboot:spring data jpa介绍

使用spring data jpa 开发时,发现国内对spring boot jpa全面介绍的文章比较少案例也比较零碎,因此写文章总结一下。本人也正在翻译Spring Data JPA 参考指南,有兴趣的同学欢迎联系我,一起加入翻译中! spring data jpa介绍 首先了…

[lucene那点事儿]继承RangeFilter编写数字型过滤器

Lucene提供了多种针对于区间的查询的实现方式,诸如RangeQuery和RangeFilter等,通常而言,RangeQuery是最容易联想的方式,使用起来很非常的简单,但是,使用它却很容易出现TooManyClause exception,…