码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Spring AOP 实现方式与应用


    文章目录

    • Spring AOP
      • Spring AOP 概念
      • Spring AOP 的术语:
      • Spring AOP 实现方式
      • Spring AOP 的应用场景
      • Spring AOP 注意事项:
        • Spring AOP不能对哪些类进行增强?
        • 既然有没有接口都可以用CGLIB,为什么Spring还要使用JDK动态代理?
      • Spring AOP 代码案例:

    Spring AOP

    Spring AOP 概念

    AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为独立的模块。

    Spring AOP 的术语:

    • 连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。

    • 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点。切点就是提供这样一个功能的概念。

    • 通知(advice):就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。

    • 目标对象(target):即被代理对象。

    • 引入(introduction):是指引入新的类和其方法,增强现有Bean的功能。

    • 织入(weaving):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。

    • 切面(aspect):是一个可以定义切点、各类通知和引入的内容的模块化实现,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。

    Spring AOP 实现方式

    AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式:

    • JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。
    • CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。

    Spring AOP 的应用场景

    Spring AOP为IoC的使用提供了更多的便利,一方面,应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能。

    另一方面,在Spring内部,一些支持模块也是通过Spring AOP来实现的,比如事务处理。从这两个角度就已经可以看到Spring AOP的核心地位了。

    Spring AOP 注意事项:

    Spring AOP不能对哪些类进行增强?

    1. Spring AOP只能对IoC容器中的Bean进行增强,对于不受容器管理的对象不能增强 。
    2. 由于CGLib采用动态创建子类的方式生成代理对象,所以不能对final修饰的类进行代理。

    既然有没有接口都可以用CGLIB,为什么Spring还要使用JDK动态代理?

    在性能方面,CGLib创建的代理对象比JDK动态代理创建的代理对象高很多。但是,CGLib在创建代理对象时所花费的时间比JDK动态代理多很多。

    所以,对于单例的对象因为无需频繁创建代理对象,采用CGLib动态代理比较合适。反之,对于多例的对象因为需要频繁的创建代理对象,则JDK动态代理更合适。

    Spring AOP 代码案例:

    可以参考我之前的博客:https://blog.csdn.net/weixin_45525272/article/details/125955628,https://blog.csdn.net/weixin_45525272/article/details/125955860

    等

  • 相关阅读:
    若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法
    学习和认知的四个阶段,以及学习方法分享
    Web 3.0 安全风险,您需要了解这些内容
    人脸识别之light_cnn
    2013年108计网
    2023-1024程序员节
    Level1行情和l2行情数据api接口在逐笔成交记录上有什么区别?
    【树莓派不吃灰】搭建sqlite3数据库环境
    如何在JVM中基于引用计数法实现GC
    iOS Socket编程入门指北
  • 原文地址:https://blog.csdn.net/weixin_45525272/article/details/126512856
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号