当前位置:首页 > 数码 > AOP成功面向切面编程的关键技术-Java

AOP成功面向切面编程的关键技术-Java

admin7个月前 (05-01)数码16

在软件开发中,面向切面编程(Aspect-OrientedProgramming,AOP)是一种关键的编程思维和技术。与传统的面向对象编程(Object-OrientedProgramming,OOP)相比,AOP愈加器重关于横切逻辑(Cross-CuttingConcerns)的处置,例如日志记载、意外处置、性能监测等方面。经过将这些逻辑分别进去并集成进系统中,可以提高代码的重用性、可保养性和可裁减性。

AOP是基于Java言语的成功形式,基于灵活代理和反射机制,提供了一种在运转时对程序启动阻拦和修正的才干,使得程序员能够以愈加灵敏和繁难的形式处置横切逻辑。本文将引见应用JavaAOP成功面向切面编程的关键技术,包括以下几个方面:

AOP的外围概念

1、切面(Aspect)

切面是AOP中的一个关键概念,示意由一组通用的横切逻辑造成的模块化单元。切面定义了某些特定的关注点(Concern),它们与系统中其余局部的逻辑离开,以便启动独立的模块化设计、测试和部署。例如,一个日志切面可以担任记载系统中一切的方法调用,而与这些方法的详细成功有关。

2、衔接点(JoinPoint)

衔接点是在程序口头环节中,拔出切面代码的特定点。它示意了运行程序中可以被阻拦和修正的点。例如,在方法调用前、后或抛出意外时都可以作为衔接点。

3、切点(Pointcut)

Java

切点是指衔接点的汇合,它定义了哪些衔接点会被切面阻拦和修正。

4、通知(Advice)

通知是切面口头的代码,它定义了在特定的衔接点上口头的横切逻辑。通知可以依据衔接点的类型和触发期间分为以下几种:

5、切面织入(AspectWeaving)

切面织入是指将切面代码拔出到指标对象中,使其与指标对象启动交织。它可以经过静态织入和灵活织入两种形式成功。静态织入是指在编译时将切面代码拔出到指标对象中,而灵活织入则是在运转时启动。

基于JavaAOP的成功技术

1、静态代理

静态代理是JavaAOP中最繁难的一种成功形式。它经过创立一个代理类来封装指标对象,并在代理类中参与切面代码。代理类成功了与指标对象相反的接口,使得它可以代替指标对象,并在其中参与横切逻辑。经常使用静态代理时,代理类须要手动编写,因此不够灵敏和繁难。

2、灵活代理

灵活代理是JavaAOP中最罕用的一种成功形式。它应用Java反射机制和代理对象,灵活生成代理类,并在代理类中参与切面代码。相比于静态代理,灵活代理不须要手动编写代理类,因此愈加灵敏和繁难。Java中提供了两种灵活代理形式:JDK灵活代理和CGLIB代理。

AspectJ是一个基于JavaAOP技术的框架,它裁减了Java言语,提供了愈增弱小和灵敏的AOP支持。AspectJ支持多种切入点和通知类型,并提供了申明式、注解式和编程式等多种AOP编程形式。经过AspectJ,程序员可以愈加繁难地处置横切逻辑,并将其集成进系统中。

以下是一个繁难的经常使用JDK灵活代理成功AOP的示例,它经常使用前置通知和后置通知对指标对象启动阻拦和修正:

publicinterfaceHelloService{voidsayHello(Stringname);}publicclassHelloServiceImplimplementsHelloService{publicvoidsayHello(Stringname){System.out.println("Hello,"+name);}}publicclassMyAspect{publicvoidbefore(){System.out.println("BeforesayHello");}publicvoidafter(){System.out.println("AftersayHello");}}publicclassDynamicProxyHandlerimplementsInvocationHandler{privateObjecttarget;privateObjectaspect;publicDynamicProxyHandler(Objecttarget,Objectaspect){this.target=target;this.aspect=aspect;}publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{MethodbeforeMethod=aspect.getClass().getMethod("before");beforeMethod.invoke(aspect);Objectresult=method.invoke(target,args);MethodafterMethod=aspect.getClass().getMethod("after");afterMethod.invoke(aspect);returnresult;}}publicclassMn{publicstaticvoidmain(String[]args){HelloServicetarget=newHelloServiceImpl();MyAspectaspect=newMyAspect();DynamicProxyHandlerhandler=newDynamicProxyHandler(target,aspect);HelloServiceproxy=(HelloService)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);proxy.sayHello("World");}}

在上述示例中,咱们定义了一个HelloService接口和对应的成功类HelloServiceImpl,以及一个MyAspect切面类。经过成功InvocationHandler接口,咱们可以经常使用Proxy.newProxyInstance()方法灵活地生成一个代理类,并在其中拔出切面代码。在灵活代理的invoke()方法中,咱们区分调用了MyAspect的前置通知和后置通知方法,并在其中经过反射机制调用指标对象的sayHello()方法。最终,咱们创立了一个代理对象,经过它来调用指标对象的方法,从而成功了AOP的成果。

应用JavaAOP成功面向切面编程是一种关键的编程思维和技术。本文引见了AOP的外围概念和基于JavaAOP的成功技术,包括静态代理、灵活代理和AspectJ。经过运行示例的解说,咱们可以愈加深化地理解AOP在程序设计中的运行。


spring 框架的面向切面编程如何理解?

Spring提供了对AOP技术的良好封装,AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多的方法中要加入某种系统功能代码,例如:加入日志、权限判断、异常处理等,这种应用成为AOP。 实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,而是作为目标的子类在JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某类个生成子类,则可以用CGLIB。 在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类。 Sping提供了这种支持,只需要在Sping配置文件中配置这两个元素即可实现代理和Aop功能,例如:<bean id = proxy type = ><property name = target ref = ></property><property name = advisor ref = ></property></bean>

springaop原理

原理:sping aop是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。

其原理的相关技术:

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。AOP(这里的AOP指的是面向切面编程思想,而不是Spring AOP)主要的的实现技术主要有Spring AOP和AspectJ。

AspectJ的底层技术是静态代理,即用一种AspectJ支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增强,相对于下面说的运行时增强,编译时增强的性能更好。

Spring AOP采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的支持以及CGLib的支持。

JDK动态代理只能为接口创建动态代理实例,而不能对类创建动态代理。需要获得被目标类的接口信息(应用Java的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用invokeHandler方法来处理。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Java

“AOP成功面向切面编程的关键技术-Java” 的相关文章

深入探讨-Java-编程中的类继承与接口实现 (深入探讨交流)

深入探讨-Java-编程中的类继承与接口实现 (深入探讨交流)

简介 类索引、父类索引和接口索引是在 Class 文件中用于确定类的继承关系的重要数据。通过这些索引,Java 虚拟机 (JVM) 可以准确地建立类之间的继承关系,实现多态性和接口的实现。...

大编程趋势-5-年-Java-2024-开发者的 (编程是大趋势吗)

大编程趋势-5-年-Java-2024-开发者的 (编程是大趋势吗)

Java 作为编程领域的支柱,拥有超过 900 万开发人员和超过 30 年的发展历史。它以其先进的安全功能、优越的性能和跨平台开发能力而闻名。展望 2024 年,Java 正准备进行一场突破性的转...

选择性-过多的关键词会增加SEO工作的复杂性-关键词不应过多 (选择性太多)

选择性-过多的关键词会增加SEO工作的复杂性-关键词不应过多 (选择性太多)

引言 在不断演进的软件开发领域,保持最新技术至关重要。从 Java 11 迁移到 Java 21 是一个明智的决定,它带来了显着的优势和创新,可以提升应用程序的安全性、性能和开发效率。...

Java循环结构与实现方式 (java循环语句案例)

Java循环结构与实现方式 (java循环语句案例)

循环简介 循环是编程中常用的一种控制结构,用于重复执行某一段代码或操作。循环的执行需要满足一定的条件,当条件满足时,循环会一直执行,直到条件不满足时才结束。所以循环其实就是重复地完成某一件事...

Java-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

Java-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

Lambda表白式是8中引入的最有影响力的性能之一。它们经过准许繁复而优雅地创立匿名函数来成功Java中的函数式编程。在这篇博文中,咱们将讨论编写lambda表白式的各种方式。 概述...

用Java实现自动化测试和质量控制-分步指南 (用java实现幸运抽奖)

用Java实现自动化测试和质量控制-分步指南 (用java实现幸运抽奖)

自动化测试概述 自动化测试是指使用软件工具和脚本来执行测试任务,以代替人工操作并提高测试效率。 自动化测试的优势 提高效率 可重复性 提高覆盖率...

Java中不倡导经常使用foreach的六大场景 (java中不等于怎么写)

Java中不倡导经常使用foreach的六大场景 (java中不等于怎么写)

在中,foreach是一个罕用的循环结构,它可以极大地简化遍历数组或汇合(例如List或Set)的代码。它通常被以为是一种愈加繁复和易读的迭代形式。但是,或许有一些状况下不倡导经常使用foreac...

Java-渣滓回收器的运作形式-对不再沉闷对象的跟踪机制

Java-渣滓回收器的运作形式-对不再沉闷对象的跟踪机制

作为一门面向对象的编程言语,具备智能内存治理的个性。这象征着开发人员无需手动调配和监禁内存,而是由Java虚构机的渣滓回收器担任治理。渣滓回收器经过监督程序中不再经常使用的对象来回收内存,以提高内...