SpringAOP拦截器的代理机制

要使用方法名匹配AOP切面编程,需要使用到spring中的org.springframework.aop.support.NameMatchMethodPointcutAdvisor这个类,advice属性定义一个通告类,mappedName定义通告类针对的方法,通告的类需要实现一些特定的接口在特定的时候执行:

MethodBeforeAdvice :方法之前执行

AfterReturningAdvice:方法之后执行

继承 ThrowsAdviceInterceptor:抛出异常之后执行

AOP代理类通过org.springframework.aop.framework.ProxyFactoryBean实现,属性target定义需要进行通告的类或接口,属性interceptorNames定义拦截使用的类,返回字符串数组,这样就基本实现了AOP代理。代码如下

<bean id="methodBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <property name="advice">
            <bean class="com.yxfei.advice.MyBeforeAdvice"></bean>
        </property>
        <property name="mappedName">
            <value>*</value>
        </property>
    </bean>
    <bean id="methodAfterAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <property name="advice">
            <bean class="com.yxfei.advice.MyAfterAdvice"></bean>
        </property>
        <!-- 拦截方法匹配 -->
        <property name="mappedName">
            <value>hello*</value>
        </property>
    </bean>

    <bean id="myService" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="interceptorNames">
            <list>
                <value>methodBeforeAdvisor</value>
                <value>methodAfterAdvisor</value>
            </list>
        </property>
        <property name="target">
            <bean class="com.yxfei.pointcut.MyPointCut"></bean>
        </property>
    </bean>

其中com.yxfei.advice.MyBeforeAdvice实现org.springframework.aop.MethodBeforeAdvice接口,而com.yxfei.advice.MyAfterAdvice实现org.springframework.aop.AfterReturningAdvice接口,ProxyFactoryBean只能拦截到一个目标中,如果要实现拦截多个类,则需要使用
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator,属性beanNames配置多个类,返回String数组,通配符*Dao,表示名为Dao结尾的所有类进行拦截。实现代码如下:

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
       <property name="beanNames">
           <list>
               <value>*Dao</value>
           </list>
       </property>
       <property name="interceptorNames">
           <list>
               <value>transactionInterceptor</value>
           </list>
       </property>
   </bean> 
时间: 2024-10-06 17:40:46

SpringAOP拦截器的代理机制的相关文章

Spring异步调用原理及SpringAop拦截器链原理

一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync { /** * Indicate the 'async' annotation type to be detected at

Ehcache学习(三)ehcache与springAOP拦截器实例

本次我们使用springAOP+ehcache结合来实现数据的缓存,我们可以 Cache 系统中 Service 或则 DAO 层的 get/find 等方法返回结果,如果数据更新( 使用Create/update/delete 方法), 则刷新 cache 中相应的内容. Aop中最常见的就是拦截器,那么我们首先需要创建的就是一个拦截器: ?  MethodCacheInterceptor <span style="font-family:Microsoft YaHei;font-siz

C#使用Emit构造拦截器动态代理类

在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 public class Interceptor 2 { 3 public object Invoke(object @object, string @method, object[] parameters) 4 { 5 Console.WriteLine( 6 string.Format("Int

struts2拦截器的实现机制

前言 最近老大让每周写一篇技术性的博客,想想也没啥写,就想着随便拿个以前的项目去研究研究五大框架的底层代码.本人水平有限,有不对的地方还望大家勿喷,指正! 开始之前先了解下strtus2的工作流程: 工作原理图: (1) 客户端(Client)向Action发用一个请求(Request) (2) Container通过web.xml映射请求,并获得控制器(Controller)的名字 (3) 容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或Fil

vue下axios拦截器token刷新机制

//创建http.js文件,以下是具体代码: //引入安装的axios插件 import axios from 'axios' import router from '@/router'; import Vue from 'vue' const qs = require("qs"); let _this = new Vue(); let isLock = false; let refreshSubscribers = []; //判断token是否过期 function isToken

Struts2 源码分析——拦截器的机制

本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样子讲吧.拦截器的应用是sturts2核心的亮点之一.如果不明白拦截器是什么的话,那么你相当于没有学习过struts2.笔者本来想直接讲这一章的知识点.可是又怕读者可能对拦截器没有一个概念化的理解.为什么这么讲呢?struts2在设计拦截器这一个部分的内容.在笔者看来事实是以AOP为核心思想来设计的.

由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把mybatis的拦截器源码大致的看了一遍,为了温故而知新,在此就按照自己的理解由浅入深的理解一下它的设计. 和大家分享一下,不足和谬误之处欢迎交流.直接入正题. 首先,先不管mybatis的源码是怎么设计的,先假设一下自己要做一个拦截器应该怎么做.拦截器的实现都是基于代理的设计模式设计的,简单的说就是要创造一个目标类的代理类,在代理类中执行目标类的方法并拦截执行拦截器代码. 那么我们就用JDK的动态代理设计一个简单的拦截器

java 动态代理—— Mybaties 拦截器链基本原理实现

1.摘要 Mybaties 中有个分页插件,之前有特意的去了解了一下原理 :https://www.cnblogs.com/jonrain0625/p/11168247.html,从了解中得知分页插件是基于Mybaties的拦截器去实现的,这个插件就是一个拦截器,和别的拦截器组成了Mybaties的拦截器链,然后所有的拦截器都对Executor 这个类 做了动态代理.本次主要的再次去学习下这个动态代理,去实现一个最基本的拦截器链的效果.当然还有spring aop 等很多地方都是基于动态代理去实

Struts2的拦截器

拦截器的作用: 拦截器可以动态地拦截发送到指定Action的请求,通过拦截器机制,可以载Action执行的前后插入某些代码,植入我们的逻辑思维. 拦截器的实现原理: 拦截器通过代理的方式来调用,通过动态代理我们的Action,在Action的执行前后植入我们的拦截代码.这种拦截器的思想就是一种AOP,取得业务处理过程的切面,在特定切面 通过系统自动插入特定方法. Struts2中的拦截器: 在平常的项目中,我们经常需要解析上传表单中的文件域,防止表单多次提交……,这些操作不是所有Action都需