手动实现切面的第N种方法---MethodInterceptor

一句话总结:

        通过实现MethodInterceptor接口并重写invoke方法,你能够控制方法调用的流程,并基于MethodInvocation对象获取到所有关于被拦截方法的信息,从而实现切面编程中的各种需求。

结合具体例子讲解:场景是rpc远程接口调用实现日志记录。

具体原理及步骤:

1. 代理与拦截点识别

        首先,Spring会在应用上下文中创建目标对象(即你想要增强的业务对象)的代理对象。这个代理对象是在运行时生成的,它可以是JDK动态代理或者CGLIB代理,具体取决于你的配置和目标类是否实现了接口。代理对象会负责在调用实际方法前后插入切面逻辑。      

  1. 初始化配置:在Spring的配置文件中,你需要定义一个BeanNameAutoProxyCreator的Bean,并设置其属性,如beanNames(指定需要被代理的Bean名称)和interceptorNames(指定要使用的拦截器或切面Bean)。

  2. Bean实例化与后处理:当Spring容器初始化时,会遍历所有待创建的Bean。对于每个Bean,如果它的名称匹配了BeanNameAutoProxyCreator配置中的beanNames,那么Spring就会使用这个类来创建一个代理对象。

  3. 创建代理BeanNameAutoProxyCreator通过检查目标Bean是否需要增强(即是否匹配配置的Bean名),并根据配置的拦截器来创建代理。它会根据目标Bean的类型选择合适的代理方式(JDK动态代理或CGLIB),然后在代理逻辑中插入拦截器。

  4. 代理逻辑执行:当通过代理对象调用目标方法时,代理逻辑会在调用前后执行配置的通知(例如前置通知、后置通知等),从而实现切面功能的织入。

  

        

 

注:接口被调用时会经由拦截器拦截增强

可以发现该拦截器是实现了BaseInterceptor接口的。

2. MethodInvocation对象

        当客户端代码通过代理对象调用一个方法时,这个调用不会直接转发到目标对象,而是先经过代理对象的处理逻辑。在这个过程中,Spring会创建一个MethodInvocation对象。这个对象封装了方法调用的所有必要信息,包括目标对象、被调用的方法、方法参数等。它作为参数传递给invoke方法,使得切面可以访问和操作这些信息。

注:用户使用时重写businessInvoke方法就可以了,因为这里做了上下文传递。

3. invoke方法调用

        你实现的MethodInterceptor接口中的invoke(MethodInvocation invocation)方法会被调用。(这里是businessInvoke)在这个方法内,你可以根据MethodInvocation对象来决定如何处理这次方法调用。比如,你可以在调用实际方法之前、之后添加额外的操作,修改参数或返回值,甚至完全替代原有的方法调用逻辑。

4. 访问方法信息

        通过MethodInvocation对象,你可以获取到被拦截方法的信息。例如,使用invocation.getMethod()可以获得java.lang.reflect.Method对象,进而可以获取方法名、返回类型、参数类型等信息。同时,invocation.getArguments()可以获取到调用该方法时传入的实际参数值。

5. 执行逻辑

        在invoke方法内部,你可以选择调用invocation.proceed()来继续执行被拦截的方法(即调用目标对象上的原始方法)。如果不调用proceed(),则相当于阻止了原方法的执行,这在某些场景下(如完全替代原有逻辑)可能会用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值