热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring实战(九)AOP概念以及SpringAOP

1、横切关注点(cross-cuttingconcern)软件开发中,散布于应用中多处的功能被称为横切关注点,如事务、日志、安全。横切关注点从概念上是与应用的业务逻辑相分离的(但

  1、横切关注点(cross-cutting concern)

  软件开发中,散布于应用中多处的功能被称为横切关注点,如事务、日志、安全。

  横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中),而把横切关注点和业务逻辑分离正是AOP要解决的问题。

  DI用于应用对象之间的解耦,AOP实现横切关注点与他们所影响的对象之间的解耦。

 

  2、重用通用功能,最常见的技术是继承和委托

  继承会导致脆弱的对象体系;委托可能需要对委托对象进行复杂的调用。

  所以用切面取而代之。

 

  3、AOP术语

  Aspect:切面——把横切关注点模块化为特殊的类,这些类称为切面。

  Advice:通知or增强——所要增强or增加的功能,模式有Before、After、After-returning,、After-throwing、Around

  Join Point:连接点——应用执行过程中,能够插入切面的所有“点”(时机)

  Pointcut:切点——实际运行中,选择插入切面的连接点,即定义了哪些点得到了增强。

  Introduction:引入——向现有的类添加新方法和属性。

  Weaving:织入——把切面应用到目标对象并创建新的代理对象的过程。(也可以为植入)

 

  4、在目标对象的生命周期中,有多个点可以进行织入:

  • 编译期——需要特殊的编译器,AspectJ的织入编译器是以这种方式织入切面。
  • 类加载期——切面在目标类加载到JVM时被织入,需要特殊的类加载器(ClassLoader),使目标类被导入应用之前增强该目标类的字节码。
  • 运行期——切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP以这种方式织入切面!

  

  5、Spring中提供了4种类型的AOP支持

  • 基于代理的经典Spring AOP;
  • 纯POJO切面——XML配置
  • @AspectJ注解驱动的切面——无需XML配置
  • 注入式AspectJ切面

  前三种是Spring AOP实现的变体,Spring AOP构建在动态代理基础上,因此,Spring对AOP的支持局限于方法拦截。如果你的AOP需求超过了简单的方法调用,如构造器或者属性拦截,那么你需要考虑使用AspectJ来实现切面

 

  6、Spring创建的通知都是用标准的Java类编写的,定义通知应用的切点可以使用注解或在Spring配置文件中用XML编写。

  AspectJ则用特有的AOP语言,可以获得更强大和细粒度的控制。

 

  7、Spring在运行时通知/增强目标对象——动态代理

  Spring中的切面由包裹了目标对象的代理类实现。代理类拦截并处理方法的调用,执行额外的切面逻辑,然后再调用目标对象的方法。

  那代理对象是什么时候创建的呢?

  当应用需要被代理的bean时,Spring才创建代理对象。

  被代理的对象(目标对象)又是什么时候创建?

  如果使用AppplicationContext,AppplicationContext从BeanFactory中加载所有bean时,Spring创建被代理对象。

 

  8、Spring只支持方法级别的连接点。

  AOP中连接点的模型有多种,如字段和构造器接入点。

  由于Spring基于动态代理,所以只支持方法连接点,因此无法创建细粒度的通知。

  如果需要方法拦截之外的连接点拦截功能,需要利用AspectJ补充Spring AOP。

 


推荐阅读
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 类加载机制是Java虚拟机运行时的重要组成部分。本文深入解析了类加载过程的第二阶段,详细阐述了从类被加载到虚拟机内存开始,直至其从内存中卸载的整个生命周期。这一过程中,类经历了加载(Loading)、验证(Verification)等多个关键步骤。通过具体的实例和代码示例,本文探讨了每个阶段的具体操作和潜在问题,帮助读者全面理解类加载机制的内部运作。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
author-avatar
changeverything77_262
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有