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

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

admin5个月前 (05-01)数码12

在软件开发中,面向切面编程(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-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

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

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

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

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

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

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

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

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

掌握Java并发编程-免除竞态条件的困扰 (掌握JavaScript基础)

掌握Java并发编程-免除竞态条件的困扰 (掌握JavaScript基础)

1. 竞态条件的概念和问题 竞态条件指的是多个线程同时访问共享资源,由于执行顺序的不确定性,导致程序结果与预期不符的情况。竞态条件问题通常出现在以下情况下: 多个线程争用同一把锁 多个线程...

Java-以及如何成功它-为何它本应更繁难-异步编程 (java一个子类可以有多个父类吗)

Java-以及如何成功它-为何它本应更繁难-异步编程 (java一个子类可以有多个父类吗)

在过去的好多年里,多线程和异步不时作为技术里的初级局部,在技术序列中,一个言语分为入门局部、进阶局部和初级局部,所以,异步是作为其中的初级技术局部存在的。 关于异步和多线程这局部吧,经常存在...

消除反复编译困扰-优化效率-释放Java开发潜能 (消除反复编译命令)

消除反复编译困扰-优化效率-释放Java开发潜能 (消除反复编译命令)

在开发过程中,反复编译是一个常见的问题,特别是在大型项目或者需要频繁修改代码的情况下。每次修改代码后都需要重新编译整个项目,这样耗费了大量的时间和资源,降低了开发效率。为了解决这个问题,我们可以采...

Java-三分钟速成-揭秘多线程编程新范式-虚拟线程 (java三目表达式)

Java-三分钟速成-揭秘多线程编程新范式-虚拟线程 (java三目表达式)

背景 虚拟线程是 Java 语言中的一种轻量级线程,可以减少编写、维护和调试高吞吐量并发应用程序的工作量。虚拟线程的详细背景介绍可以在 JEP 444 中找到。 平台线程...

Java废品回收器对循环引用对象的处理机制 (java废弃方法)

Java废品回收器对循环引用对象的处理机制 (java废弃方法)

循环引用的定义和问题 循环引用是指两个或多个对象之间形成了相互引用的关系,形成了一个环状结构。例如,对象 A 引用了对象 B,而对象 B 又引用了对象 A,它们之间形成了一个循环引用。在这种情况...