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

作者&投稿:汗娥 (若有异议请与网页底部的电邮联系)
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-framework-4.2.5.RELEASE-dist 去开发基于AOP的程序,除了要安装aspectJ1.7 ,然后包含aspectJ1.7 lib 下的包外,
额外还需要包含下面的包:
com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
cglib-2.2.2.jar

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.org.apache.commons.logging-1.1.1.jar

commons-logging.ar

dom4j-2.0.0-RC1.jar

mysql-connector-java-5.1.34-bin.jar

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官方文档的理解(不出意外是最正确的答案):

①选择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包。

spring AOP就是用aspectj来实现的,是依赖关系!AspectJ是动态代理的一种实现!而spring默认使用的就是AspectJ来实现的动态代理,spring自己的AOP就是使用AspectJ来实现的!当然你也可以使用其他的实现,如cglib!

springaop的底层实现有两种,一种是jdk的动态代理,另一种是cglib,springaop没有用到aspectj,只是借鉴了它并添加了aspectj风格的注解,使用aspectj必须用到它自己特殊的编译器和运行环境的插件。

说到AOP,估计最直接的应用就是事务管理吧。
1. Spring有自己的AOP实现,即使用TransactionProxyFactoryBean,然后使用XML进行配置。缺点是,只要你想用AOP的话,就得去配置,比较繁琐。

2. 而aspectj 则则是第三方的框架(库),使用上比较简单,也是通过XML的方式去配置,不同的是可以定义某些方法的开头开启事务,其他不开启事务。当然也可以通过注解的方式去做,这个最常用的就是做日志处理。
其实,我觉得Spring也可以去简化配置,只不过已经有了aspectj ,就直接使用即可。


英语IF虚拟语气的用法
(事实:原来不知道) c、表示将来难以实现的愿望 谓语动词:should\/would 动词原形 eg. I wish I should have a chance again.我希望我还能有一次这样的...surpring. funny. right. wrong. better. a pity等。 句型:It is...that 结构后的主语从句,从句的谓语动词都要用 should 原型 或只用动词原型。 ④...

数学名人名言短句
上帝创造了整数,所有其余的数都是人造的。——克罗内克 数学知识对于我们来说,其价值不止是由于他是一种有力的工具,同时还在于数学自身地完美。在数学内部或外部地展开中,我们看到了最纯粹的逻辑思维活动,以及最高级地智能活力地美学体现。——A.Pringsheim 数学之所以比一切其它科学受到尊重,一个...

spring boot springapplicationbuilder configure怎么不调用_百度知 ...
Spring Boot是Spring社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进行入门体验,让Java开发也能够实现Ruby on Rails那样的生产效率。为Spring生态系统提供了一种固定的、约定优于配置风格的框架。Spring Boot具有如下特性:为基于Spring...

beangle 怎样读取struts配置文件
4、Spring 支持基于spring的再配置和自动配置 5、Struts2 Coc 提供struts2的约定优先配置和基础Action 6、Struts2 Tag 提供常见的web组件 7、Security Core 提供简化的权限控制框架 8、Security Web 提供web应用上的权限集成 9、Security Bluepring 提供基于数据存储的默认权限实现 10、Security Cas Support...

shell如何实现 数字自动补零 字符串自动补零 awk
大家在处理数据文件的时候,可能会遇到这个问题,shell 对字符串进行处理,如果字符串 长度不足3位,需要左边自动补0。比如:12,自动补齐为 012 解决的方法有两种,一种是shell的pringf命令,另一种是使用神器awk :

java 程序 在线等!!!
\/\/实现7个号码的产生 public void generate(){ int tmp;for(int j=0;j<7;j++){ tmp=(int)(Math.random()*36);while(tmp==0)tmp=(int)(Math.random()*36);num[j]=tmp;} } \/\/实现票头的打印 public static void pringTitle(){ System.out.println("欢迎使用本彩票号码选择器");S...

用VB编写一个程序,三个数比较大小的问题
a和B先对比 如果A大于B 然后 D等于A (输入框现实的是最大A!) 否则显示最大B 再用C和D对比(由于D已经等于了A或B的值!所以就拿D和C对比了)如果C大 然后D等于C 如果C小 不做反应!也就是没有否则!下面是代码:Private Sub Command1_Click()Dim a, b, c, d As Single a ...

哪位兄弟能给一个用汇编语言编写的打印程序?
打印程序的编写在windows程序设计中非常有用,针对不同的用户需要,通常用sdk方式实现打印代码量比较大,而且要对打印流程的底层有非常清楚的了解,需要一个程序员有非常深入的打印方面的知识,利用MFC提供的文档视图结构,不但可以实现一些常用的标准界面元素,把数据的处理的界面的处理分离出来,而且其提供的打印功能更是方便快...

量子是物理世界里最小的基本个体
量子密钥分发可以建立安全的通信密码, 通过一次一密的加密方式可以实现点对点方式的安全经典通信. 这里的安全性是在数学上已经获得严格证明的安全性, 这是经典通信迄今为止做不到的. 现有的量子密钥分发技术可以实现百公里量级的量子密钥分发, 辅以光开关等技术, 还可以实现量子密钥分发网络。 量子态隐形传...

No transaction aspect-managed TransactionStatus in scope
原因四:还可能是pring AOP代理不支持类内部方法调用导致的,就是同一个Service中a方法调用b方法。Spring官方也不推荐使用类内部方法相互调用,一个是代理对象、一个是目标对象,Spring没办法对目标对象进行事务切面处理。有很多成熟的方案可以解决这个问题,比如开启AOP代理ThreadLocal支持或者Service中声明一个...

阿克苏市15990963442: spring已经实现了aop,为什么还要用aspectj -
冯荆中鑫: 根据我看spring官方文档的理解(不出意外是最正确的答案):①选择spring的AOP还是AspectJ? spring确实有自己的AOP.功能已经基本够用了,除非你的要在接口上动态代理或者方法拦截精确到getter和setter.这些都是写奇葩的需求,一般...

阿克苏市15990963442: Spring中的ioc和aop有什么作用?为什么要用ioc和aop?面试中多次被问到,求一个详细 清晰的解答... -
冯荆中鑫: 我来说说我的理解: 面试的时候,尽量不要照本宣科,这样给面试官的印象是很差的.用自己的话理解是最好的.我先来将两个例子: ioc,控制反转,这个指的就是我们获取对象的方式进行反转了,改变了.在使用spring之前是需要手动new...

阿克苏市15990963442: 为什么spring中AOP 用的很少 -
冯荆中鑫: spring AOP不是用反射实现的,而bean的创建一般是这样做的. spring里主要通过Java动态代理接口、cglib生成子类、AspectJ这三种方式来实现AOP.通过AOP进行声明式事务管理应该是大家用的最多的吧.像权限校验和日志记录虽然也具...

阿克苏市15990963442: 为什么Spring成为SOA开发的首选Java轻量级框架? -
冯荆中鑫: 在实际的业务逻辑分析中,准确抽象出Aspect,并且以面向接口编程的方式描述出来,通常需要我们从传统的OO概念总跳脱出来,把眼光从局部的Object放宽至Aspect,发现各个子系统、业务流程逻辑所包含的共有特征,在Aspect层面实现重...

阿克苏市15990963442: spring中aop的实现原理是什么,它是怎么获得插入点方法参数的? -
冯荆中鑫: 首先楼主需要明白“事物处理”的概念 AOP主要是针对事物处理来说吧,而且是相对于以前的编程式事物处理的,不用AOP的话,我们得通过硬编码的方式将事物处理写在方法中,有了AOP之后,我们只需要在spring的配置文件中配置一下事物就可以了,这就叫声明式事物处理.一般配置时是通过配置匹配某个格式的方法名,当运行到这种方法的时候spring就会拦截下它来,并给它加上事物的处理了 通俗点讲spring的AOP相当与电脑中主板的作用.主板:就是把各种元器件连接到其上,统一由其管理,避免了元器件与与器件之间连接的混乱

阿克苏市15990963442: 为什么要用spring的IOC和AOP -
冯荆中鑫: 1、为什么不要?你问这个问题,说明你你连Spring的功能都不知道.2、IOC是Spring的核心,你说要不要?IOC依赖注入/控制反转,它可以自动的给其他像Action和Service,Dao初始化,功能极其强大.3、AOP面向切面的编程,采用的是代理机制,你可以采用AOP在程序中添加日志管理,安全管理,权限控制,当然不仅只有这些.4、你得好好了解下Spring,它是个很狂妄的家伙.

阿克苏市15990963442: 什么是Aop编程,Aop在spring中是如何实现的,它的运行机制是什么? -
冯荆中鑫: aop就是切面编程,通俗的说,java是面向对象,会有很多很多类,然而这些类会有一向相同的行为,对这一类相同的行为做操作,就是aop了

阿克苏市15990963442: 有人能通俗介绍下SPRING的AOP吗? -
冯荆中鑫: 想简单通俗的说,额,有难度.AOP主要是针对事物处理来说吧,而且是相对于以前的编程式事物处理的,不用AOP的话,我们得通过硬编码的方式将事物处理写在方法中,有了AOP之后,我们只需要在spring的配置文件中配置一下事物就可以了,这就叫声明式事物处理.一般配置时是通过配置匹配某个格式的方法名,当运行到这种方法的时候spring就会拦截下它来,并给它加上事物的处理了

阿克苏市15990963442: spring实现aop的几种方式及其适用场合 -
冯荆中鑫: aop 可以说是spring的一大特色,主要应用场景有事物管理、权限、日志这几块用的比较多.

阿克苏市15990963442: spring的aop是怎么影响代码的 -
冯荆中鑫: AOP为Aspect Oriented Programming的缩写,意为:面向方法编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网