aspectj和springaop区别(aspect aop和spring aop)

本篇文章给大家谈谈aspectj和springaop区别,以及aspect aop和spring aop对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

aspectj和Spring AOP的关系

aspectj 单独使用的教程

两旦帆野个之间的关系说明

这篇文章会继续试着解决这几个问题。

首先了解下AspectJ的几种织入方式,分别是compile-time、post-compile 和 load-time,分别对应着编译期、后编译期、加载期织入

首先是编译期织入,上一篇博客所介绍的方式就是使用的编译期织入。很容易理解,普通的 java源码 + aspectJ特殊语法的‘配置’ 文轿宽件 + aspectJ特殊的编译器 ,编译时候生成已织入后的.class文件,运行时直接运行即可。

后编译期织入和编译期的不同在于,织入的是class字节码或者jar文件。这种形式,可以织入一个已经织入过一次的切面。同样这种情况也需要 特殊的编译器

加载期顾名思义,是在 类被加载进虚拟机之前 织入,使用这种方式,须使用AspectJ agent。

了解了模喊这些概念,下面就要知道,spring是使用哪种呢?spring哪一种都不是,spring是在 运行期 进行的织入。

AspectJ 本身是不支持运行期织入的,日常使用时候,我们经常回听说,spring 使用aspectJ实现了aop,听起来好像spring的aop完全是依赖于aspectJ

其实spring对于aop的实现是通过动态代理(jdk的动态代理或者cglib的动态代理),它只是使用了aspectJ的Annotation,并没有使用它的编译期和织入器,关于这个可以看这篇 文章 ,也就是说spring并不是直接使用aspectJ实现aop的

看了很多篇博客以及源码,我对spring aop与aspectJ的理解大概是这样;

1)spring aop 使用AspectJ语法的一个子集,一些method call, class member set/get 等aspectJ支持的语法它都不支持

2)spring aop 底层是动态代理,所以受限于这点,有些增强就做不到,比如 调用自己的方法就无法走代理

看下下面的例子:

这个时候method2是 无法被切到 的,要想被切到可以通过如下奇葩的方式:

之前碰到这样的问题时,我还特别不能理解,现在想下aop的底层实现方式就很容易理解了。

在之前写的 jdk动态代理与cglib动态代理实现原理 ,我们知道了jdk动态代理是通过动态生成一个类的方式实现的代理,也就是说 代理是不会修改底层类字节码的 ,所以可能生成的代理方法是这样的

回头看a.method1()的源码,也就明白了,为啥method2()没有被切到, 因为a.method1()执行的方法,最后调用的不是 代理对象.method2(),而是它自己的method2()(this.method2()) 这个方法本身没有任何改动

反观aspectJ,aspectJ是在编译期修改了方法(类本身的字节码被改了),所以可以很轻松地实现调用自己的方法时候的增强。

3)spring aop的代理必须依赖于bean被spring管理,所以如果项目没有使用spring,又想使用aop,那就只能使用aspectJ了(不过现在没有用spring的项目应该挺少的吧。。。)

4)aspectJ由于是编译期进行的织入,性能会比spring好一点

5)spring可以通过@EnableLoadTimeWeaving 开启加载期织入(只是知道这个东西,没怎么研究。。有兴趣的可以自己去研究下)

6)spring aop很多概念和aspectJ是一致的

了解了spring与aspectJ的关系后,就能更清晰的了解spring 的aop了。

先说明一点,虽然我介绍aspect的配置时,一直介绍的aspectJ文件配置方式,但是aspectJ本身是支持注解方式配置的。可以看官方文档, 注解在aspectJ中的使用

而spring 使用了aspectJ注解的一小部分(正如前面所说的,受限于jdk的动态代理,spring只支持方法级别的切面)

回头看看之前看到的这段源码,什么是AjType,经过aspectJ解析器解析后对类的一种描述,比如正常的方法可能是这样

在AjType中就能获取到很多其他的aspectJ所需的相关信息(除了java反射所能获取到的信息以外)

比如看着两个方法,可以获取到切入点信息。

在看看 PerClauseKind.SINGLETON 这里就复用了aspectJ的概念,详细可以看 这篇文章 最后部分

[img]

spring aop,aspectj aop的实现原理分别是什么,两种aop的框架都支持哪些增强方法

你好,别想的太难了,你可以参考一下底下:

1、使用基于注解的AOP事务管理

探索tx:annotation-driven标签:

标签是注解驱动的事务管理支持的核心。

标签的属性:

transaction-manager:指定到现有的PlatformTransactionManager bean的引用,通知会使用该引用。default="transactionManager"

mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。清兄前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理。

order:指定创建的切面的顺序。只要目标对象有多个通知就可以使用该属性。

proxy-target-class:该属性如果为true就表示你想要代理目标类而不是bean所实现的所有接口。default="false"

探索@Transactional注解:

你可以指定传播、隔离级别、超时以及允许和不允许的异常。

@Transactional注解的属性:

propagation:指定事务定义中使用的传播

isolation:设定事务的隔离级别

timeout:指定事务的超市(秒)

readOnly:指定事务的超时

noRollbackFor:目标方法可抛出的异常所构成的数组,但通知仍会提交事务

rollbackFor:异常所构成的数组,如果目标方法抛出了这些异常,通知就会回滚事务

基于注解的事务管理小结:

如果定义在类上,那么所有的方法都使用相同的方式,有些read就会抱怨给太多的东西了。

如果在每个方法上都定义注解,那么就会很麻烦。

(可以使用XML AOP事务管理能更好的处理这种情况)

2、使用XML AOP事务管理

标签,该标签会创建一个事务处理通知。

view plaincopy to clipboardprint?

aop:pointcut id="allServiceMethods"

expression="execution(* com.apress.prospring2.ch16.services.*.*(..))"/

aop:advisor advice-ref="defaultTransactionAdvice"

pointcut-ref="allServiceMethods"/

tx:method

name="*"

isolation="DEFAULT"

propagation="缺慧REQUIRED"

no-rollback-for="java.lang.RuntimeException"

timeout="100"/

tx:method

name="get*"

read-only="true"/

3、tx:advice标签简介

id是该advice bean的标识,而transaction-manager则必须引用一个PlatformTransactionManager bean。

还可以通过标签定制标签所创建的通知的行为。

标签的属性:

name:方法名的匹配模式,通知根据该模式寻找匹配的方法。

propagation:设定事务定义伏正答所用的传播级别。

isolation:设置事务的隔离级别。

timeout:指定事务的超时(秒)。

read-only:该属性为true指示事务是只读的

no-rollback-for:以逗号分隔的异常类的列表,目标方法可以跑出这些异常而不会导致通知执行回滚

rollback-for:以逗号分隔的异常类的列表,当目标方法跑出这些异常时会导致通知执行回滚。默认情况下,该列表为空,因此不在no-rollback-for列表中的任何运行时异常都会导致回滚。

中isolation(隔离)和propagation(传播)参数的含义:

getIsolationLevel:他对其他事务所看到的数据变化进行控制。

事务隔离级别:

隔离级别 说明

ISOLATION_DEFAULT 默认级别(对大多数数据库来说就是ISOLATION_READ_COMMITTED)

ISOLATION_READ_UNCOMMITTED 最低的隔离级别。事实上我们不应该隔离级别,因为在事务完成前,其他事务可以看到该事务所修改的数据。而在其他事务提交前,该事务也可以看到其他事务所做的修改。

ISOLATION_READ_COMMITTED 大多数数据库的默认级别。在事务完成前,其他事务无法看到该事务所修改的数据。遗憾的是,在该事务提交后,你就可以查看其他事务插入活更新的数据。这意味着在事务的不同点上,如果其他事务修改数据,你会看到不同的数据。

ISOLATION_REPEATABLE_READ 该隔离级别确保如果在事务中查询了某个数据集,你至少还能再次查询到相同的数据集,即使其他事务修改了所查询的数据。然而如果其他事务插入了新数据,你就可以查询到该新插入的数据。

ISOLATION_SERIALIZABLE 代价最大、可靠性最高的隔离级别,所有的事务都是俺顺序一个接一个的执行。

getPropagationBehavior:指定了当代码请求一个新的事务时Spring所做的事情。

传播行为指:

传播行为 说明

PROPAGATION_REQUIRED 当前如果有事务,Spring就会使用该事务;否则会开始一个新事务。

PROPAGATION_SUPPORTS 当前如果有事务,Spring就会使用该事务;否则不会开启一个新事务。

PROPAGATION_MANDATORY 当前如果有事务,Spring就会使用该事务;否则会抛出异常。

PROPAGATION_REQUIRES_NEW Spring总会开始一个新事务。如果当前有事务,则该事务挂起。

PROPAGATION_NOT_SUPPORTED Spring不会执行事务中的代码。代码总是在非事务环境下执行,如果当期有事务,则该事务挂起。

PROPAGATION_NEVER 即使当前有事务,Spring也会在飞事务环境下执行。如果当前有事务,则抛出异常。

PROPAGATION_NESTED 如果当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与PROPAGATION_REQUIRED一样。

望采纳!

spring 中的和有什么区别

 败段姿 在AOP中有几个概念:

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

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

— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”察绝、“before”和“throws”通知。

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

 

 所以“aop:aspect”实际上是定义横切逻辑,就是在连接点上做什么,“aop:advisor”则定义了在哪

些连接点应用什么aop:aspect。Spring这样做的好处燃裤就是可以让多个横切逻辑(即aop:aspect定义

的)多次使用,提供可重用性。

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

spring已经实现了aop,为什么还要用aspectj

spring有自己的AOP实现与aspectj的实现不同比较麻烦,马士兵的教程所讲的是spring整合了aspectj的AOP马士兵没有将spring自己激渣蚂的aop,在视频的末尾他说一般情况用不到spring自己的AOP你可以仔细听听,spring在做声明式事物处理时就没有用aspectj嘛!springAOP是设计用于在应用服务器环境下实现AOP,切入点与方面均由普通Java对梁凳象实现,其中连接点模型与AspectJ相同,只是远不如AspectJ丰富。针对你的问题spring有两组AOP一组是spring本身的一组是整合AspectJ,就好比在国际上一个中国人说英语是因为大家都说英语(好比AspectJ),但中国人还明埋有自己的语言中文(spring自己的AOP)

spring已经实现了aop,为什么还要用“aspectj”?

根据我看spring官方文档的理解(不出意外是最正确拆租的答案):

①选择spring的AOP还是旅绝兆AspectJ?

spring确实有自己的AOP。功能已经基本够用了,除非你的要在接口上动态代理或者方法拦截精确到getter和setter。这些都是写奇葩的需求,一般不使用。

②在使用AOP的时候,你是用xml还是注解的方式(@Aspect)?

1)如果使用xml方式,不需要任何额外的jar包。

2)如果使用@Aspect方式,你就可以在类上直接一个@Aspect就搞定,不用费事在xml里配了。但是这需要额外的jar包( aspectjweaver.jar)。因为spring直接使用AspectJ的注解功能,注意只是使用了它 的注解功能而已。并不是核心功能 !!!

注意到文档上还有一句很有意思的话:文档说到 是选择宏唤spring AOP还是使用full aspectJ?

什么是full aspectJ?如果你使用"full aspectJ"。就是说你可以实现基于接口的动态代理,等等强大的功能。而不仅仅是aspectj的 注-解-功-能 !!!

如果用full AspectJ。比如说Load-Time Weaving的方式 还 需要额外的jar包 spring-instrument.jar

当然,无论是使用spring aop还是 aspectj都需要aspectjweaver.jar spring-aop.jar这两个jar包。

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

标签列表