AOP成功面向切面编程的关键技术-Java
在软件开发中,面向切面编程(Aspect-OrientedProgramming,AOP)是一种关键的编程思维和技术。与传统的面向对象编程(Object-OrientedProgramming,OOP)相比,AOP愈加器重关于横切逻辑(Cross-CuttingConcerns)的处置,例如日志记载、意外处置、性能监测等方面。经过将这些逻辑分别进去并集成进系统中,可以提高代码的重用性、可保养性和可裁减性。
AOP是基于Java言语的成功形式,基于灵活代理和反射机制,提供了一种在运转时对程序启动阻拦和修正的才干,使得程序员能够以愈加灵敏和繁难的形式处置横切逻辑。本文将引见应用JavaAOP成功面向切面编程的关键技术,包括以下几个方面:
AOP的外围概念
1、切面(Aspect)
切面是AOP中的一个关键概念,示意由一组通用的横切逻辑造成的模块化单元。切面定义了某些特定的关注点(Concern),它们与系统中其余局部的逻辑离开,以便启动独立的模块化设计、测试和部署。例如,一个日志切面可以担任记载系统中一切的方法调用,而与这些方法的详细成功有关。
2、衔接点(JoinPoint)
衔接点是在程序口头环节中,拔出切面代码的特定点。它示意了运行程序中可以被阻拦和修正的点。例如,在方法调用前、后或抛出意外时都可以作为衔接点。
3、切点(Pointcut)
切点是指衔接点的汇合,它定义了哪些衔接点会被切面阻拦和修正。
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方法来处理。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。