Spring AOP框架

Ansi,Unicode(little endian),Unicode big endian,UTF-8编码文件相互转换 阅读详情

 AOP正在成为软件开发的下一个圣杯。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。 
为了理解AOP如何做到这点,考虑一下记日志的工作。日志本身不太可能是你开发的主程序的主要任务。如果能将“不可见的”、通用的日志代码注入主程序中,那该多好啊。AOP可以帮助你做到。 
Spring framework是很有前途的AOP技术。作为一种非侵略性的,轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是象往常一样编程。 
AOP是很多直觉难以理解的术语的根源。幸运的是,你只要理解三个概念,就可以编写AOP模块。这三个概念是:advice,pointcut和advisor。advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置,通常是某个特定的类的一个public方法。advisor是pointcut和advice的装配器,是将advice注入主程序中预定义位置的代码。 

既然我们知道了需要使用advisor向主要代码中注入“不可见的”advice,让我们实现一个Spring AOP的例子。在这个例子中,我们将实现一个before advice,这意味着advice的代码在被调用的public方法开始前被执行。以下是这个before advice的实现代码: 

代码: 
package com.company.springaop.test; 

import java.lang.reflect.Method; 
import org.springframework.aop.MethodBeforeAdvice; 

public class TestBeforeAdvice implements MethodBeforeAdvice { 

  public void before(Method m, Object[] args, Object target) 
  throws Throwable { 
    System.out.println("Hello world! (by " 
        + this.getClass().getName() 
        + ")"); 
  } 
} 
  


接口MethodBeforeAdvice只有一个方法before需要实现,它定义了advice的实现。before方法共用三个参数,它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时,参数args和被执行方法的名称,都是非常有用的信息。你也可以改变传给m的参数,但要小心使用这个功能;编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。 

在下面的BeanImpl类中,每个public方法调用前,都会执行advice: 

代码: 
package com.company.springaop.test; 

public class BeanImpl implements Bean { 

  public void theMethod() { 
    System.out.println(this.getClass().getName() 
        + "." + new Exception().getStackTrace()[0].getMethodName() 
        + "()" 
        + " says HELLO!"); 
  } 
} 


类BeanImpl实现了下面的接口Bean: 

代码: 
package com.company.springaop.test; 

public interface Bean { 
  public void theMethod(); 
} 



虽然不是必须使用接口,但面向接口而不是面向实现编程是良好的编程实践,Spring也鼓励这样做。 

pointcut和advice通过配置文件来实现,因此,接下来你只需编写主方法的Java代码: 
代码: 


package com.company.springaop.test; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext; 

public class Main { 

  public static void main(String[] args) { 
    //Read the configuration file 
    ApplicationContext ctx 
        = new FileSystemXmlApplicationContext("springconfig.xml"); 

    //Instantiate an object 
    Bean x = (Bean) ctx.getBean("bean"); 

    //Execute the public method of the bean (the test) 
    x.theMethod(); 
  } 
} 



我们从读入和处理配置文件开始,接下来马上要创建它。这个配置文件将作为粘合程序不同部分的“胶水”。读入和处理配置文件后,我们会得到一个创建工厂ctx。任何一个Spring管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。 

仅仅用配置文件便可把程序的每一部分组装起来。 
代码: 

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 
  <!--CONFIG--> 
  <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
      <value>com.company.springaop.test.Bean</value> 
    </property> 
    <property name="target"> 
      <ref local="beanTarget"/> 
    </property> 
    <property name="interceptorNames"> 
      <list> 
        <value>theAdvisor</value> 
      </list> 
    </property> 
  </bean> 

  <!--CLASS--> 
  <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/> 

  <!--ADVISOR--> 
  <!--Note: An advisor assembles pointcut and advice--> 
  <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
    <property name="advice"> 
      <ref local="theBeforeAdvice"/> 
    </property> 
    <property name="pattern"> 
      <value>com/.company/.springaop/.test/.Bean/.theMethod</value> 
    </property> 
  </bean> 

  <!--ADVICE--> 
  <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/> 
</beans> 
  


四个bean定义的次序并不重要。我们现在有了一个advice,一个包含了正则表达式pointcut的advisor,一个主程序类和一个配置好的接口,通过工厂ctx,这个接口返回自己本身实现的一个引用。 

BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创建一个bean元素,并指定了一个实现类。这就是全部的工作。 

advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我们用advisor的一个属性来指定它所需的advice-bean。第二个属性则用正则表达式定义了pointcut,确保良好的性能和易读性。 

最后配置的是bean,它可以通过一个工厂来创建。bean的定义看起来比实际上要复杂。bean是ProxyFactoryBean的一个实现,它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义: 




属性proxyInterface定义了接口类。 

属性target指向本地配置的一个bean,这个bean返回一个接口的实现。 

属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的。 



Spring工具 

虽然你可以手工修改Ant构建脚本,但使用SpringUI(译注:SpringUI现在是Spring framework的一部分,并改名为spring-ide),使用Spring AOP变得很简单,只要点点鼠标即可。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,并选择“add Spring Project Nature”。在project属性中,你可以在“Spring Project”下添加Spring配置文件。在编译前把下面的类库加入project:aopalliance.jar,commons-logging.jar,jakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息: 

... (logging information) 
Hello world! (by com.company.springaop.test.TestBeforeAdvice) 
com.company.springaop.test.BeanImpl.theMethod() says HELLO! 


优点和缺点 

Spring比起其他的framework更有优势,因为除了AOP以外,它提供了更多别的功能。作为一个轻型framework,它在J2EE不同的部分都可以发挥作用。因此,即使不想使用Spring AOP,你可能还是想使用Spring。另一个优点是,Spring并不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一页开始。读了本文后,你应该可以更好地理解Spring reference了。Spring唯一的缺点是缺乏更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档。

手写Spring框架之AOP 简介 手写Spring框架第一篇博客(必读): 手写Spring框架 前面两篇博客已经实现了Bean容器, IOC功能和MVC功能, 本篇博客来实现AOP功能和事务管理. 在看下面的内容之前, 一定要先回顾下Spring AOP和动态代理. Spring AOP 动态代理 handwritten-mvc-framwork 实现 定义注解 (1) 切面注解 @Target(ElementType.T... 阅读详情

相关推荐

Spring框架中AOP应用的入门案例

面向切面编程(AOP)是软件开发中的一种编程范式,它通过分离横切关注点(cross-cutting concerns)来增加模块化。在Spring框架中,AOP被广泛应用于事务管理、安全检查、日志记录和缓存等方面。它允许开发者定义方法执行前后以及抛出异常时需要执行的代码(通知),而不需要修改原有业务逻辑。Spring AOP利用动态代理机制来实现AOP,支持方法级别的拦截。接下来,本文将深入探讨AOP的核心概念,包括切面、通知、连接点、织入等,并比较Spring AOP与其他AOP实现的不同之处。

weixin_42351520的博客 948

AOP的学习

        AOP正在成为软件开发的下一个圣杯。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。         为了理解AOP如何做到这点,考虑一下记日志的工作。日志本身不太可能是你开发的主程序的主要任务。如果能将“不可见的”、通用的日志代码注入主程序中,那该多好啊。AOP可以帮助你做到。         Spr...

toube的专栏 263

阻抗匹配详解

在深入理解阻抗匹配概念之前,我们可以先来一起看一个现象,首先使用一个信号发生器输出一个脉宽为 50ns 的单脉冲信号,同时将信号接入示波器,此时在示波器的波形视图上可以看到这个仅有一个脉冲的信号,如下图。如果我们将信号接入示波器的同时将电缆延长数米到外部,并且延长后电缆末端保持悬空不接入任何东西,引出一段未接入任何东西的开路电缆,按照常识应该没有任何影响,然而实测是在原有脉冲旁边多出了一个类似脉冲,如下图。

zhbi98 的技术 Blogs 2564

Spring 對 Lob 的支援...

如果要將 將檔案存入資料庫,我們在JDBC中可以使用CLOB與BLOB來分別針對文字檔案與二進位檔案進行儲存,Spring中可以透過JdbcTemplate來處理CLOB與BLOB。 舉個例子來說,假設您的MySQL資料庫表格如下: 12345

林信良(良葛格)的专栏 5021

深信服防火墙路由模式开局部署-手把手教学(小白篇)

手把手教学,拿到深信服的防火墙路由模式该如何开局?

m0_64423407的博客 2万+

控制台模拟前端请求实现快速刷网课时长

本教程仅用于学习前端技术和网页开发,旨在提供教育与技术指导。对于任何未经授权或违反规定的使用行为,本人不承担任何责任。注意到那个serive后面有timestamp时间戳,暗示它很可能就是每30秒汇报一次进度和播放时长的命令,我们右键——复制——复制为fetch。有的网站上的网课需要的不仅仅是进度,而是时长,所以倍速插件失效,但我们可以使用控制台命令来模拟请求实现快速刷网课时长。尝试修改即可,例如我修改time为800,然后复制粘贴到控制台执行。播放视频,等待前端请求出现,然后复制前端请求为fetch。

m0_74823408的博客 2068

spring的AOP和事务

动态代理 代理模式:给一个对象提供一个代理,并由代理对象来控制真实对象的访问(调用者并不知道真实对象是什么)。 代理模式分静态代理和动态代理。这里只讨论动态代理,通俗的讲,动态代理就是在不修改代码的基础对被代理对象进行方法的增强。 基于接口的动态代理 JDK自带的动态代理就是基于接口的动态代理,被代理对象至少要实现一个接口,否则就无法使用代理。底层还是基于Java的反射来创建代理对象的。 JDK动...

monkey-jie的博客 469

GPT Researcher 的win docker安装攻略

github网址是:https://github.com/assafelovic/gpt-researcher/blob/master/README-zh_CN.md。使用 Docker 运行 AI-Researcher 项目的。因为docker安装方法不够清晰,因此写一个使用方法。打开设置——docker engine ,增加代码。如有其他问题,可提供错误截图或日志进一步排查!

weixin_43818488的博客 1126

Spring 框架之 AOP 原理剖析

前言 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了 OOP(Object-Oriented Programming)面向对象编程。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 AOP 关注的不再是类,而是一系列类里面需要共同能力的行为。 本文内容主要包括:...

优快云 官方博客 6596

基于51单片机语音识别智能台灯设计

智能台灯;语音识别;STC89C52RC单片机

Benso_H的博客 5843

Hexo博客使用PDF.js

clone了一个pdf.js 然后兴高采烈地到文章里使用{% pdf %}标签 结果浏览器弹出了个下载框(使用GitHub的raw) 不知道是不是因为使用GitHub的原因导致这个问题 后来我测试的时候报了个错 优快云上的解决方法 到时候我再试试把资源放回lib/里面看看行不行 目录1.clone1.1.官方方法1.2.NexT主题方法1.3.补充2.修改文件2.1.修改viewer.htm...

LTFan 962

Spring框架AOP学习总结(下)

文章目录1、 AOP 的概述1、1 为什么学习 AOP1、2 AOP底层实现: 代理机制(了解)2、 Spring 的基于 AspectJ 的 AOP 开发(XML 的方式)2.1 AOP 的开发中的相关术语:2.2 Spring 使用 AspectJ 进行 AOP 的开发入门(XML 的方式):2.2.1 引入相应的 jar 包2.2.2 引入 Spring 的配置文件2.2.3 编写目标类...

宜春 1万+

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署

YOLO(You Only Look Once)系列算法因其高效、准确等特点而备受瞩目。由2023年Ultralytics公司发布了YOLO的最新版本YOLOv8是结合前几代YOLO的基础上的一个融合改进版。本文YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署,从网络结构的讲解从模型的网络结构讲解到模型的部署都有详细介绍,同时在本专栏中还包括YOLOv8模型系列的改进包括个人提出的创新点,传统卷积、注意力机制、损失函数的修改教程,能够帮助你的论文获得创新点。

Snu77的博客 8万+

Spring框架--AOP框架

什么是 AOP 的技术? 在软件业,AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程 AOP:面向切面编程.(思想.---解决 OOP 遇到一些问题)AOP 采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存) 为什么要学习 AOP--可以在不修改源代码的前提下,对程序进行增强。运行期间,不修改源代码的情况下对已有的方法进行增强 优势(1)JDK 的动态代理技术 (2)cglib 代理技术 Joinpoint(连接点) 所谓连

2301_81535770的博客 822

079、LVGL基础控件:消息框(Msgbox)

《LVGL消息框控件深度解析与避坑指南》 文章深入剖析了LVGL消息框控件的核心特性和使用技巧。消息框本质是带按钮的模态容器,而非独立窗口。作者分享了创建消息框的正确姿势、标题/内容设置方法、安全的按钮事件处理方式(避免直接调用close函数导致栈溢出),并详细介绍了模态/非模态实现、样式自定义、动态更新等实用技巧。针对常见问题如内存管理、按钮数量限制、动画效果等给出了专业建议,特别强调了消息框作为用户交互关键环节的优化重要性,建议通过异步删除、合理父对象选择等方式提升稳定性。文章包含大量实际项目经验总结,

m0_50546716的博客 153

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring框架中对于AOP的理解

Spring AOP 通过切面封装横切关注点,实现了业务逻辑与非业务逻辑的解耦,提高了代码的复用性和可维护性。其核心是通过动态代理在目标方法执行过程中嵌入切面逻辑,常用注解式配置,广泛应用于日志、事务、安全等场景。理解 AOP 是掌握 Spring 框架的关键。

Z123C456H的博客 742

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring 框架的 AOP

Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。 在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方面。依赖注入帮助你对应用程序对象相互解耦和 AOP 可以帮助你从它们所影响的对象中对横切关注点解耦。AOP 是像

qq_42918433的博客 146

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring框架-AOP

Asperct Oriented Programming 面向切面编程。是一种利用“横切”的技术(底层实现就是动态代理),对原有的业务逻辑进行拦截,并且可以在拦截的横切面上添加特定的业务逻辑,对原有的业务进行增强。基于动态代理实现在不改变原有业务的情况下,对业务逻辑进行增强。

f135917h的博客 763

Spring框架AOP思想

Spring框架AOP思想 一、AOP简介 1、AOP概念:面向切面编程,通过预编译方式和运行期动态代理,实现程序功能的统一维护的一种技术;利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 2、AOP功能:Aop的功能主要是为了拦截或者实现日志安全检查,一些检查的工作,aop也常用于事务管理,防止垃圾数据进入数据库。 3...

xfj_csdn的博客 257

Spring框架的AOP使用方法

本文介绍了AOP(面向切面编程)的概念、原理及实现方式。AOP通过动态代理在不修改源代码的情况下增强业务逻辑,降低耦合度。底层实现分为JDK动态代理(针对有接口的情况)和CGLIB动态代理(无接口情况)。文章详细讲解了AOP术语(连接点、切入点、通知、切面)和五种通知类型(@Before、@After、@AfterReturning、@Around、@AfterThrowing)。重点阐述了基于AspectJ的两种AOP实现方式:注解方式(推荐)和XML配置方式,包括切入点表达式语法和增强类优先级设置。

MyNAMS的博客 1015

【Spring框架】AOP

文章目录AOP简介AOP相关术语AOP的设计原理和思想1、AOP横向抽象技术的介绍2、使用代理模式的Java程序执行流3、Spring AOP的工作原理AOP的使用1、引入AOP需要的相关jar包2、配置XML文件3、写出相关实例(实现类和增强类)(1)基于XML配置型的实现4、配置切入点5、使用AOP(2)基于注解的方式实现4、配置XML文件5、在增强类上添加注解6、使用AOP AOP简介 AOP(全称Aspect Oriented Programming) 即:面向切面编程。 通过预编译方式和运行期间

Super_Powerbank的博客 612

spring框架中Aop

1,基本介绍 Spring 框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。 在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方面。依赖注入帮助...

weixin_45491031的博客 320

关于Spring框架AOP的理解

关于Spring框架AOP的个人理解 1.AOP的概念: 百度结果: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 个人理解: AOP是在不通过修改原有业务的基础上,为了增强某些业务的功能而诞生的一种编程思想,至于这个切面我希望可以通过下面的图示来说明。 AOP切面开发的理解: 正常代码是纵向开发的,然而为了解决在更改代码时防止对代码实现误改和其他原因导致源码出问题,则要在每个类都添加一个代理

qq_41978509的博客 455

Spring框架——IOC与AOP

Spring 框架两大核心机制(IoC、AOP) IoC(控制反转)/ DI(依赖注入) AOP(面向切面编程) Spring 是一个企业级开发框架,是软件设计层面的框架,优势在于可以将应用程序进行分层,开发者可以自主选择组件。 MVC:Struts2、Spring MVC ORMapping:Hibernate、MyBatis、Spring Data 如何使用 IoC 创建 Maven 工...

追求幸福,探索未知的博客 651

Spring框架中的核心技术之AOP

Spring框架的核心技术之AOP,面向切面编程,动态代理,Spring面试必问

weixin_44362089的博客 5855

Spring框架 IOC和AOP

IOC是一种设计思想,就是将原本在程序中需要手动创建的对象,交由Spring管理创建。例如我们要在A类中调用B类的对象,就直接在A类中new处对象,然后调用B类中的方法,虽然能够实现效果,但当想要修改需求时,只能修改源码。所以现在创建B类对象就交给了Spring,在Spring中,B类对象被看成了Bean(Spring中类就是Bean),这个Bean由Spring创建和管理,这样就不会主动new,由spring创建,降低了耦合,其中依赖类不需要通过程序员实例化,而是通过Spring容器帮我们new指定实例并

TANGWENYU_的博客 331
上一篇: 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
下一篇: Spring AOP @AspectJ 入门实例
cnham
博客等级 码龄24年 264粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值