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

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

本文目录

  • spring已经实现了aop,为什么还要用aspectj
  • spring aop,aspectj aop的实现原理分别是什么,两种aop的框架都支持哪些增强方法
  • 如何在android studio 中使用aspectj
  • aspectj框架的aop开发方式有哪几种
  • AspectJ如何实现AOP
  • 四,spring的aspectj注解有哪些,分别是什么意思
  • aspect的简单记法
  • 怎么在Eclipse中安装支持AspectJ开发的AJDT插件
  • spring已经实现了aop,为什么还要用“aspectj”
  • java spring@AspectJ的作用

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 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一样。
望采纳!

如何在android studio 中使用aspectj


首先需要新建一个module,方便引入相关的AspectJ配置,便于在其中编写与业务逻辑无关紧要,并且在代码中经常出现的常用代码,
之后在module下的build.gradle中 导入AspectJ的dependences
compile ‘org.aspectj:aspectjrt:1.8.9’
并在build.gradle根下配置
repositories {
mavenCentral()
}
buildscript {
repositories {
mavenCentral()
}
dependencies {

aspectj框架的aop开发方式有哪几种


使用aspectj实现aop有两种方式:

(1)基于aspectj的xml配置;

(2)基于aspectj的注解方式;

基于aspectj的xml配置:

(1)导入相关的AOP的jar包

(2)创建Spring核心配置文件,导入aop的约束

(3)使用表达式配置切入点

常用的表达式:

execution(《访问修饰符》?《返回类型》《方法名》(《参数》)《异常》)

(4)代码测试

基于aspectj的注解方式:

(1)导入与AOP相关的jar包

(2)创建对象:

(3)开启Aop操作:

(4)在增强类使用注解@Aspect,在方法上使用注解完结增强配置。

(5)测试代码


AspectJ如何实现AOP


我们只需要提供两个不同的Aspect--认证Aspect和事务Aspect。 比如,我们有一个Bank(银行)类。Bank有两个方法,deposit(存钱)和withdraw(取钱)。 class Bank { public float deposit(AccountInfo account, float money){// 增加account账户的钱数,返回账户里当前的钱数 }public float withdraw(AccountInfo account, float money){// 减少account账户的钱数,返回取出的钱数 }} 这两个方法涉及到用户的账户资金等重要信息,必须要非常小心,所以编写完上面的商业逻辑之后,项目负责人又提出了新的要求--给Bank类的每个重要方法加上安全认证特性。 于是,我们不得不分别在上面的两个方法中加入安全认证的代码。 class Bank { public float deposit(AccountInfo account, float money){// 验证account是否为合法用户 // 增加account账户的钱数,返回账户里当前的钱数 }public float withdraw(AccountInfo account, float money){// 验证account是否为合法用户 // 减少account账户的钱数,返回取出的钱数 }}这两个方法都需要操作数据库,为了保持数据完整性,项目负责人又提出了新的要求--给Bank类的每个操作数据库的方法加上事务控制。 于是,我们不得不分别在上面的两个方法中加入安全认证的代码。 class Bank { public float deposit(AccountInfo account, float money){// 验证account是否为合法用户 // Begin Transaction// 增加account账户的钱数,返回账户里当前的钱数 // End Transaction}public float withdraw(AccountInfo account, float money){// 验证account是否为合法用户 // Begin Transaction// 减少account账户的钱数,返回取出的钱数 // End Transaction}}我们看到,这些与商业逻辑无关的重复代码遍布在整个程序中。实际的工程项目中涉及到的类和函数,远远不止两个。如何解决这种问题? 我们首先来看看OOP能否解决这个问题。 我们利用Design Pattern的Template Pattern,可以抽出一个框架,改变上面的例子的整个设计结构。 abstract class Base {public float importantMethod(AccountInfo account, float money){// 验证account是否为合法用户 // Begin Transactionfloat result = yourBusiness(account, money)// End Transactionreturn result;}protected abstract float yourBusiness(AccountInfo account, float money);}class BankDeposit extends Base{protected float yourBusiness(AccountInfo account, float money){// 增加account账户的钱数,返回账户里当前的钱数 }};class BankWithdraw extends Base{protected float yourBusiness(AccountInfo account, float money){// 减少account账户的钱数,返回取出的钱数 }};这里我们用一种很勉强的方法实现了认证和事务代码的重用。而且,有心的读者可能会注意到,这种方法的前提是,强制所有的方法都遵守同样的signature。 如果有一个转账方法transfer(AccountInfo giver, AccountInfo receiver, float money),由于transfer方法的signature不同于yourBusiness的signature,这个方法无法使用上面的框架。 这个例子中提到的认证,事务等方面,就是AOP所关心的Aspect。 AOP就是为了解决这种问题而出现的。AOP的目的就是-- Separation of Concerns.// 验证account是否为合法用户 return proceed();}}aspect TransactionAspect { pointcut bankMethods() : execution(* Bank.deposit(…)) || execution (* Bank. withdraw (…));Object around(): bankMethods(){// Begin TransactionObject result = proceed();return result;}}我们用AspectJ编译器编译Bank文件和含有aspect的这个文件,出来的结果就是带有安全认证和事务处理的Bank类。编译出来的这个Bank类调用了AspectJ Runtime Lib,所以,如果你要运行这个Bank类,你需要把AspectJ Runtime Lib设置在你的classpath里面。 我们来看看,AspectJ编译器为我们做了什么事情。1. 首先,AspectJ从文件列表里取出所有的文件名,然后读取这些文件,进行分析。2. AspectJ发现一些文件含有aspect的定义,在这个例子里,就是AuthAspect和TransactionAspect的定义;这些aspect就是代码生成规则。3. AspectJ根据这些aspect代码生成规则,修改添加你的源代码。在这个例子里,就是修改添加Bank文件。4. AspectJ读取AuthAspect的定义,发现了一个pointcut--bankMethods();这个pointcut的定义是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示所有对Bank类的deposit和withdraw方法的执行点。5. AspectJ继续读取AuthAspect的定义,发现了一个around(),这在AspectJ中叫做Advice,Advice允许你在某个类的方法的调用之前或调用之后,加入另外的代码。所示代码中的around()的“ // 验证account是否为合法用户“部分,就是要加入的代码。这段代码要加在哪里呢?around()后面跟了一个pointcut--bankMethods()。根据这个pointcut,AspectJ会把这段代码加入到Bank.deposit和Bank.withdraw两个方法的执行之前。6. AspectJ读取TransactionAspect的定义,象第(4)步一样,发现了发现了一个pointcut--bankMethods()。AspectJ继续读取AuthAspect的定义,发现了一个around()。

四,spring的aspectj注解有哪些,分别是什么意思


注解模式的aspectj中,切面逻辑、切入点等都需要集中定义在一个类中。其中:
@Pointcut注解定义了切入点,它通过一个execution表达式来指定需要切入的类和方法,将本注解所在的方法与切入的方法绑定,后续的操作中都直接使用注解所在方法的方法名来映射被切入的方法(因而本方法只需为空即可)。pointcut可定义多个
Aspectj提供了多种类型的切面逻辑:主要有@After(方法结束)、@AfterReturning(方法返回)、@AfterThrowing(方法抛出异常)、@Before(方法开始前)、@Around(方法前后)这五个针对方法的注入,以及其它一些针对变量声明的注入(不常用)
从注解的参数列表中可以看出该注解所对应的切面逻辑能提供什么样的参数,如:@AfterReturning的returning参数,可以指定目标方法的返回值在本切面逻辑中的变量名;@AfterThrowing的throwing参数,可以指定目标方法抛出的异常对象在本切面逻辑中的变量名。除此而外,所有的切面注解都必有两个参数:value和argNames,value用于指定pointcut的方法名,argNames则是目标方法各参数在本切面逻辑中的方法名
切面方法自带一个参数叫JoinPoint,其中保存了方法的一些元数据信息,最有用的便是可以从中直接获取参数对象列表,以及可以直接获取到作为注入点的目标对象
转自: t.cn / R60H3R9

aspect的简单记法


pring面向切面编程:
定义普通业务组件
定义切入点,一个切入点可能横切多个业务组件
定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
定义了增强方法的类叫做切面类 被增强的方法叫切入点
简单的给你讲些基础的知识:
1. AOP:Aspect Oriented Programming(面向切面编程)
2. 利用动态代理实现面向切面编程(底层原理是动态代理这你理解的没错)
3. Spring实现动态代理配置是有两种配置文件:1、 xml文件方式;2、annotation方式(使用AspectJ类库实现的。
4. aspectJ类库,AspectJ是一个专门用来实现动态代理(AOP编程)的类库,AspectJ是面向切面编程的框架,Spring使用就是这个类库实现动态代理的
5. aspectj的专业术语:
1、JoinPoint连接点(切入点)
2、PointCut切入点,当需要定义一个切入点时,则需要使用这个
3、Aspect切面
4、Advice切入点的逻辑
5、Target被代理对象
6、Weave织入
AspectJ与CGLIB的区别
AspectJ:编译时增强
CGLIB:运行时增强
AOP方式:
AspectJ方式
1.
aspectjweaver.jar , aspectjrt.jar
2.
《aop:aspectj-autoproxy/》或
《bean class=“org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator“/》
3.
自动搜索bean组件,自动搜索切面类
《context:component-scan base-package=““》
《context:include-filter type=“annotation“
expression=“org.aspectj.lang.annotation.Aspect“/》
《/context:component-scan》
4.
@Aspect
@Before(execution(* lee.*.*(..)))
@After(execution(* lee.*.*(..)))
@AfterReturning(pointcut=“execution(* lee.*.*(..))“,returning=“形参名“)
@AfterThrowing(pointcut=“execution(* lee.*.*(..)“,throwing=“形参名“)
@Around(execution(* lee.*.*(..)))方法第一个参数必须是ProceedingJoinPoint,并执行proceed()方法,并可以传入Ojbect
注意:
想访问目标方法参数,可以利用ProceedingJoinPoint,JoinPoint作为参数
顺序:after-》around-》afterreturning-》after
如果execution()&&args(),会找满足参数的切入点
定义个切入点 @Pointcut(“execution(* fox.aop.*.*(..))“)
public void myPointCut(){}//方法名为切入点名
@Before(“myPointCut“)//可以使用
@Around(“BeforeAdviceTest.myPointCut()“)//不在同一个类中

SpringAop方式(AOP与IOC一起来,更精彩)也就是@Component
Xml方式
《aop:config》
《aop:pointcut id=“i“ expression=“execution()“》
《aop:aspect id=““ order=““ pointcut-ref=“i“》
《aop:before,after...》
《aop:advisor》

怎么在Eclipse中安装支持AspectJ开发的AJDT插件


工具/原料

Eclipse

方法/步骤

1.首先,打开浏览器,在百度中搜索AJDT,在搜索结果中点击”AspectJ Development Tools (AJDT)“链接。、

2.进入到ajdt官网首页,点击左侧Users下的Downloads,进入到下载页面。下载页面中提供了各种版本的ajdt。

3.然后下载对应Eclipse版本的aidt(注意:一定要下载和Eclipse对应的版本不然插件不起作用),英文这里Eclipse是4.3版本的,所以这里选择下载ajdt_2.2.3_for_eclipse_4.3.zip

4.点击”ajdt_2.2.3_for_eclipse_4.3.zip“链接,在弹出来的下载框中选择文件保存的目录,点击”确定“按钮即可。

5.解压下载好的ajdt_2.2.3_for_eclipse_4.3.zip插件包,将plugins中的所有文件复制到eclipse\将plugins目录下

6.将features中的所有文件复制到eclipse\features目录下。

7.然后,进入Eclipse安装目录,点击”eclipse.exe“应用程序,启动Eclipse,选择工作空间。

8,Eclipse打开后,点击”File“--》”New“--》”AspectJProject“。

9.在”Create an AspectJ Project“窗口中输入”Project name“后,点击”Finish“按钮即可建立AspectJ工程。

10.建完工程后可以看到所建立的过程文件夹图标上有AJ两个字母,表示所建工程是AspectJ过程,工程建好就可以在上面编写代码。

END

注意事项

插件一定要和eclipse版本对应,否则在eclipse中不会显示AspectJ工程


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包。

java spring@AspectJ的作用


  AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
  AspectJ(也就是AOP)的动机是发现那些使用传统的编程方法无法很好处理的问题。考虑一个要在某些应用中实施安全策略的问题。
  安全性是贯穿于系统所有模块间的问题,每个模块都需要应用安全机制才能保证整个系统的安全性,很明显这里的安全策略的实施问题就是一个横切关注点,使用传统的编程解决此问题非常的困难而且容易产生差错,这就正是AOP发挥作用的时候了。
  @AspectJ 使用了Java5 的注解,可以将切面声明为普通的Java类。

推荐阅读