springaop原理(springaop原理和机制)

本篇文章给大家谈谈springaop原理,以及springaop原理和机制对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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方法来处理。

[img]

Spring AOP面向方面编程原理:AOP概念

AOP(Aspect Oriented Programming) 也就是面向方面编程的技术 AOP基于IoC基础 是对OOP的有益补充

AOP将应用系统分为两部分 核心业务逻辑(Core business concerns)及横向的通用逻辑 也就是所谓的方面Crosscutting enterprise concerns 例如 所有大中型应用都要涉及到的持久化管理(Persistent) 事务管理(Transaction Management) 安全管理(Security) 日志管理(Logging)和调试管理(Debugging)等

蠢厅AOP正在成为软件开发的下一个光环 使用AOP 你可以将处理aspect的代码注入主程序 通常主程序的主要目的并不在于处理这些aspect AOP可以防止代码混乱

Spring framework是很有前途的AOP技术 作为一种非侵略性的 轻型的AOP framework 你无需使用预编译器或其他的元标签 便可以在Java程序中使用它 这意味着开发团队里只需一人要对付AOP framework 其他人还是像往常一样编程

AOP概念

让我们从定义一些重要的AOP概念开始

— 方面(Aspect) 一个关注点的模块化 这个关注点实现可能另外横切多个对象 事务管理是J EE应用中一个很好的横切关注点例子 方面用Spring的Advisor或拦截器实现

— 连接点(Joinpoint) 程序执行过程中明确的点 如方法的调用或特定的异常被抛出

— 通知(Advice) 在特定的连接点 AOP框架执行的动作 各种类型的通知包括 around before 和 throws 通知 通知类型将在下面讨论 许多AOP框架包括Spring都是以拦截器做通知模型 维护一个 围绕 连接点的拦截器链

— 切入点(Pointcut) 指定一个通知将被引发的一系列连接点的集合 AOP框架必须允许开发者指定切入点 例如 使用正则表达式

— 引入(Introduction) 添加方法或字段到被通知的类 Spring允许引入新的接口到任何被通知的对象 例如 你可以使用一个引入使任何对象实现IsModified接口 来简化缓存

— 目标对象(Target Object) 包含连接点的对象 也被称作被通知或被代理对象

— AOP代理(AOP Proxy) AOP框架创建的对象 包含通知 在Spring中 AOP代理可以是JDK动态代理或CGLIB代理

— 编织(Weaving) 组装方面来创建一个被通迅凳知对象 这可以在编译时完成(例如使用AspectJ编译器) 也可以在运行时完成 Spring和其他纯Java AOP框架一样 在运行时完成织入

各种通知类型包括

—  Around通知 包围一个连接点的通知 如方法调用 这是最强大的通知 Aroud通知在方法调用前后完成自定义的行为 它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行

—  Before通知 在一个连接点之前带昌隐执行的通知 但这个通知不能阻止连接点前的执行(除非它抛出一个异常)

—  Throws通知 在方法抛出异常时执行的通知 Spring提供强制类型的Throws通知 因此你可以书写代码捕获感兴趣的异常(和它的子类) 不需要从Throwable或Exception强制类型转换

—  After returning通知 在连接点正常完成后执行的通知 例如 一个方法正常返回 没有抛出异常

Around通知是最通用的通知类型 大部分基于拦截的AOP框架(如Nanning和Jboss )只提供Around通知

如同AspectJ Spring提供所有类型的通知 我们推荐你使用最为合适的通知类型来实现需要的行为 例如 如果只是需要用一个方法的返回值来更新缓存 你最好实现一个after returning通知 而不是around通知 虽然around通知也能完成同样的事情 使用最合适的通知类型使编程模型变得简单 并能减少潜在错误 例如 你不需要调用在around通知中所需使用的MethodInvocation的proceed()方法 因此就调用失败

切入点的概念是AOP的关键 它使AOP区别于其他使用拦截的技术 切入点使通知独立于OO的层次选定目标 例如 提供声明式事务管理的around通知可以被应用到跨越多个对象的一组方法上 因此切入点构成了AOP的结构要素

下面让我们实现一个Spring AOP的例子 在这个例子中 我们将实现一个before advice 这意味着advice的代码在被调用的public方法开始前被执行 以下是这个before advice的实现代码

package ascenttech springaop test;

import java lang reflect Method;

import 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 ascenttech springaop test;

public class BeanImpl implements Bean {

public void theMethod() {

System out println(this getClass() getName()

+ + new Exception() getStackTrace()[ ] getMethodName()

+ ()

+ says HELLO! );

}

}

类BeanImpl实现了下面的接口Bean 代码如下

package ascenttech springaop test;

public interface Bean {

public void theMethod();

}

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

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

package ascenttech springaop test;

import ntext ApplicationContext;

import ntext 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= encoding= UTF ?

!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN /dtd/spring beans dtd

beans

! CONFIG

bean id= bean class= springframework aop framework ProxyFactoryBean

property name= proxyInterfaces

value ascenttech springaop test Bean/value

/property

property name= target

ref local= beanTarget /

/property

property name= interceptorNames

list

valuetheAdvisor/value

/list

/property

/bean

! CLASS

bean id= beanTarget class= ascenttech springaop test BeanImpl /

! ADVISOR

! Note: An advisor assembles pointcut and advice

bean id= theAdvisor class= springframework aop support RegexpMethod PointcutAdvisor

property name= advice

ref local= theBeforeAdvice /

/property

property name= pattern

value\ ascenttech\ springaop\ test\ Bean\ theMethod/value

/property

/bean

! ADVICE

bean id= theBeforeAdvice class= ascenttech springaop test TestBefore Advice /

/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列表的次序是非常重要的

lishixinzhi/Article/program/Java/hx/201311/26338

「Spring 」「AOP 容器」不看源码就带你认识核心流程以及运作原理

前一篇文章主要介绍了 spring 核心特性机制的 IOC 容器机制和核心运作原理,接下来我们去介绍另外一个较为核心的功能,那就是 AOP 容器机制,主要负责承接前一篇代理模式机制中动态代理:JDKProxy 和 CglibProxy 的功能机制之后,我们开始研究一下如何实现一下相关的 AOP 容器代理机制的。

实现的基本实现原理就是后置处理器:BeanPostProcessor 机制,实现动态化植入机制。

bean 在初始化的时候会进行调用对应的 BeanPostProcessor 的对应的方法会进行织入。

主要取决于 wrapIfNecessary 方法:

如果是基础设施类型,则直接回进行返回该 bean 对象,不会进行相关的初始化对应的 aspectj 的动态织入机制。

会进行寻找相关的 Bean 对应的何时的加强通知类。

则会对该 bean 对象,额外进行增强操作生成相关的代理对象,并返回该执行之后的对象,否则会直接返回该对象即可。

getAdvicesAndAdvisorsForBean 方法是我们筛选 Advice 增强类的核心方法,主要用于过滤和筛选对应该 bean 的何时的增强器数组信息。

主要用于调用 AnnotationAwareAspectJAutoProxyCreator 的**findCandidateAdvisors()**方法,其内部会进行先关的核心构建相关的 Aspectj 的类的相关实现操作

advisorsFactory.getAdvisors 获取通知器

切点类处理操作到此为止,还不完整接下来才是构建动态代理对象的真正执行操作,

扩展相关的筛选出的通知器列表,extendAdvisors 方法,通知器列表首部添加一个 DefaultPointcutAposr 类型的通知器,也就是 ExposeInvocationInterceptor.ADVISOR 的实现机制。

proxy-target-class 的属性值,代表是否可以支持代理实现类,默认采用的 false 代表着,当 bean 有实现接口的时候,会直接采用 jdk 的动态代理机制生成代理对象,如果拆亩是 true,则代表着使用 cglib 进行生成代理对象。

复制代码

前提是必须要配置相关的 expose-proxy 属性配置值为 true,才会进行暴露对应的代理机制。

为了解决目标方法调用同对象中的其他方法,其他方法的切面逻辑是无法实现,因为会涉及到相关的 this 操作而不是 proxy 对象机制。

可以实现使用 AopContext.currentProxy()强制转换为当前的代理对象。

获取相关的对应方法的拦截器栈链路,如果卜御镇没有获取到相关的缓存链路,则会直接调用相关的 getInterceptorsAndDynamicInterceptorAdvice 获取先关的拦截器链。

会进行先关的 PointcutAdvisor 类型通知器,这里会调用相关的通知器所持有的切点(Pointcut)对类和方法进行匹配,匹配冲过这说明相关的向当前的方型粗法进行织入逻辑控制。此外还会通过 geIntercptors()方法对非 MethodIntercptor 类型的通知进行转换。返回相关的拦截器数组,并且随后存入缓存中。

则会直接通过代理机制的反射控制进行调用执行即可。

则例如 jdkDynamicAutoProxy 对象进行调用构建 ReflectiveMethodInvocation 对象,例如它的 process 方法启动拦截器栈的 invoke 方法。

处理返回值,并且返回该值。

spring ioc和aop的原理是什么?

spring中ioc使用的是“生产工厂”,aop使用的是“动态代理”想知道咐亏更多建议去看一下 马士兵 的系列视频教程。

主要应用了java的反射技术,很酷;可以根据给定的参数(主要是字符串);创建相应的bean,访问相应的方法或构造器以及成员变量;具体应用可以查看帮助文档 java。lang。reflect包下的Constructor,Method, Field/java。lang。Class。

扩展资料:

Spring是全面的和模块化的。Spring有分层的体系结构,这嫌如意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。

它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。

Spring对你的工程芹简启来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。

参考资料来源:百度百科-spring

关于springaop原理和springaop原理和机制的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表