手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/00:00
登录|注册

18|拦截器 :如何在方法前后进行拦截?

你好,我是郭屹,今天我们继续手写 MiniSpring。
前面,我们用 JDK 动态代理技术实现了 AOP,并且进行了解耦,采用 IoC 容器来管理代理对象,实现了非侵入式编程。我们现在能在不影响业务代码的前提下,进行逻辑的增强工作,比如打印日志、事务处理、统计接口耗时等等,将这些例行性逻辑作为一种增强放在代理中,运行时动态插入(编织)进去。
有了这个雏形,我们自然就会进一步考虑,在这个代理结构的基础上,将动态添加逻辑这件事情做得更加结构化一点,而不是全部简单地堆在 invoke() 方法里。

引入三个概念

我们先来看看 invoke() 这个方法的代码在结构方面有什么问题。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("doAction")) {
System.out.println("-----before call real object, dynamic proxy........");
return method.invoke(target, args);
}
return null;
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何在方法前后进行拦截的技术,通过引入AOP的概念和相关概念,将增强逻辑单独剥离出来。作者详细讲解了如何改造代理类,引入了Advisor接口,并在代理类中设置了拦截器,实现了在目标对象调用前进行拦截的功能。同时,作者还展示了如何实现MethodInterceptor的具体应用,并介绍了拦截器的实现原理和应用方法。文章还讨论了拦截器对业务程序流程的影响以及在使用拦截器时需要平衡开发效率和程序可维护性的问题。整篇文章通过实际代码和配置示例,对于想要深入了解拦截器技术的读者来说,是一篇非常有价值的文章。文章内容涵盖了AOP概念、拦截器的实现原理和应用方法,以及拦截器对业务程序流程的影响等内容,适合想要深入了解拦截器技术的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 风轻扬
    老师,MethodBeforeAdviceInterceptor为什么也要实现BeforeAdvice接口呢?

    作者回复: 为了统一处理

    2023-06-03归属地:北京
  • Geek_5c6106
    老师,请问一下 ProxyFactoryBean bean中的BeanFactory beanFactory属性是在什么时候的设置值的? 这个是要在AbstractBeanFactory中设置值的吗? if (singleton instanceof FactoryBean) { return this.getObjectForBeanInstance(singleton, beanName); } getObjectForBeanInstance 方法中将this,将值设置到ProxyFactoryBean 中吗?

    作者回复: 它实现了BeanFactoryAware接口,容器对这个接口会有特殊处理:调用setBeanFactory()方法。

    2023-05-19归属地:湖北
    3
  • 马以
    思考题:因为代理对象执行的入口全部都在interceptor.invoke(invocation)这个方法中,如果想要截断,就在具体的XXXInterceptor中处理就可以了
    2023-12-27归属地:广东
  • Geek_149cde
    这儿测试的时候调用的是 doAction() 方法,但是不太理解为什么调用 doAction() 方法会自动调用 JdkDynamicAopProxy 类中的 invoke()
    2023-07-19
  • 风轻扬
    思考题:可以在MethodBeforeAdviceInterceptor中判断是否对请求进行拦截,业务意义明确
    2023-06-03归属地:北京
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部