首页 > 编程知识 正文

java语言里aop的实现种类(java中aop概念)

时间:2023-12-18 11:56:32 阅读:316802 作者:CRWR

本文目录一览:

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)测试代码

介绍几个JAVA的AOP框架开源项目

基于Java的简单、动态、轻量级、强大的AOP框架。既强大又简单,有助于更容易的集成AOP到新的或已存在的项目中。

AspectWerkz 主要特性: 

1. 运行时和加载时字节码修正:你可以在运行时或编译时轻松的改造任何(旧)应用程序或除了rt.jar以外的外部类库

2. 支持join point模型

3. 支持Annotation:匹配JavaDoc和JSR-175,支持用户自定义Annotation

4. 支持部署多个Aspect定义文件到部署的应用程序(WEB-INF/aop.xml、META-INF/aop.xml)

5. Introduction/内类型声明(也称Mixin),也就是具有添加接口和实现到已存在的类中的能力

6. Annotation定义:定义Aspect使用的运行时Annotation(为JSR-175准备)

7. XML定义:定义Aspect使用的XML;XML可以用来精炼、改写和解析Annotation定义

8. 插件式Aspect管理器能够和IoC框架(如Spring或PicoContainer)一起工作

9. 四种不同的Advice和Introduction部署模型(范围):perJVM(单模式)、 perClass、perInstance 和perThread 

10. Advice和Introduction能够动态部署、反部署或重新部署

11. 高性能,使用JIT编译

12. 使用Fine-grained模式语言选择join point

13. 所有Advice能够和所有的join point和各种混合类型的pointcut

14. 脱机变换(可以用作后处理器)

15. Aspect、Advice和Introduction使用POJO编码 

16. 目标类可以是正规的POJO,也就是不需要接口

17. 支持通过定义传递参数给Advice和定义可重用的Advice堆栈

18. 元数据被加到类中

19. 简单的用法和配置

AspectWerkz在Eclipse下的辅助开发插件→

更多AspectWerkz信息

JBoss AOP

JBoss 4.0带了一个AOP框架。这个框架和JBoss应用服务器紧密地结合,但是你也能够在你的应用中,单独的运行它。

更多JBoss AOP信息

Nanning

一个虽然简单但也是一个java开源的AOP框架。名字以中文的拼音拼写就是广西的南宁。

更多Nanning信息

JAC

JAC (Java Aspect Components)是一个应用服务器。它为Java2平台、用于Java开发的企业开发环境(J2EE)、和基于Web的分布式应用,提供开放式资源的又一个选择(在GNU次常规公共许可证下发布)。JAC包括统一模型语言(UML)IDE,该UML IDE模块化应用商业逻辑并且自动生成和编译纯商业逻辑Java类。这些类,在JAC容器内执行,可从一组技术和/或商业的横切关系(crosscutting concerns)[1] 如数据持久性、认证、配置文件管理、访问权限检测、演示、和负载平衡中无缝地受益。基于面向方面编程技术(AOP)的JAC将这些关系( concerns)[2]从应用程序的核心商业逻辑中分离出来。

更多JAC信息

DynamicAspects

DynamicAspects能够让你使用java编写的面向切面的程序设计,它使用在Sun JDK 1.5中介绍的"instrumentation"与"agent",Aspects能够软件各模块之间的关系在运行期安装与使用。

更多DynamicAspects信息

dynaop

dynaop框架使用一个基于运行时的编程机制将AOP代码插入对象中,而不是返回一个具有特征代码的对象。AOP将是面向对象设计(OO)的一个新的领域。

更多dynaop信息

CAESAR

CAESAR是一个新的与Java兼容的AOP语言。所有java程序多能使用CAESAR。

更多CAESAR信息

PROSE

PROSE是一个动态编排(weaving)工具(允许在运行期插入或抽取aspects)。PROSE aspects是规则的Java对象能够被发送到或从网络上的计算机接收。签名可被用于保证它们的完整性。一旦一个aspect插入到JVM中,任何事件的发生将影响在相应aspect advice执行的结果。假如一个aspect从JVM中撤消,aspect代码将被丢弃并且相应的拦截也将不会再发生。PROSE aspects是规则的Java对象能够被发送到或从网络上的计算机接收。签名可被用于保证它们的完整性。一旦一个aspect插入到JVM中,任何事件的发生将影响在相应aspect advice执行的结果。假如一个aspect从JVM中撤消,aspect代码将被丢弃并且相应的拦截也将不会再发生。下图是PROSE的体系结构图:

更多PROSE信息

FastAOP

FastAOP是一个高性能AOP框架。最初开发该框架是为了支持对大型J2EE应用程序进行性能剖析和监测。它几乎不占用运行时间。FastAOP已经在Websphere和Jboss应用服务器上得到成功测试。

更多FastAOP信息

Plastic

Plastic是一个构建在ASM 3.3之上的AOP工具包。支持类的基本加载和实例化。引进新的属性。不需要使用反射就能够访问私有属性和方法。重写属性访问权限。注入属性。Method advice(在调用现在方法之后/之前执行一些逻辑)。DIV class=date收录时间:2011-05-25 15:25:03/DIV

更多Plastic信息

Java实现AOP的几种方式

(1)AOP的各种实现

在编译器修改源代码、在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码。以下是各种实现机制的比较:

类别分为静态AOP(包括静态织入)和动态AOP(包括动态代理、动态字节码生成、自定义类加载器、字节码转换)。

静态织入:

a、原理:在编译期,切面直接以字节码形式编译到目标字节码文件中 ;

b、优点:对系统性能无影响;

c、缺点:不够灵活;

动态代理 :

a、原理:在运行期,目标类加载后,为接口动态生成代理类。将切面织入到代理类中;

b、优点:更灵活;

c、缺点:切入的关注点要实现接口;

Java编程中的AOP和IOC分别是什么呢,什么时候用呢

控制反转(IOC)

(理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”)

1、Ioc—Inversion of Control:即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

2、谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象即由Ioc容器来控制对象的创建。

   谁控制谁?当然是IoC 容器控制了对象。

   控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

3、为何是反转,哪些方面反转了: 有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象。

  为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。

哪些方面反转了?依赖对象的获取被反转了。     

      还是不明白没事,下面搞个简单案例来说就懂啦 !!!

      例子:当我们在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述他们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极高的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些依赖对象的创建、协调工作交给spring容器去处理,每个对象值需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等)。

总的来说:IOC就是通过在Xml配置文件里依赖注入来解决代码问题。

IOC的注入类型有几种?主要可以划分为三种:构造函数注入、属性注入和接口注入。Spring支持构造函数注入和属性注入

       

面向切面(AOP)

(面向切面编程,AOP其实只是OOP的补充而已,AOP基本上是通过代理机制实现的。)

        我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。   

         我们都知道 Java 是 OOP-面向对象编程的,它有自己的优势,也有自己的不足。比如说:在我们开发中,都会有一条业务主线(即客户的需求)。而我们要做的就是实现这个主线上的需求。我们在实现这些功能的时候,经常要干一些额外的不可避免的事情,比如事务的管理,日志的记录等,就很繁杂且代码量增多,所以 Spring 提供了另一种角度来思考程序结构,也就是把这一些事情剥离出来,然后适时适地的把它们加入到我们的代码中,比如说 声明式事务管理的时候,我们在 service 层检测到save*、update*这些方法要被调用的时候,我们先进行开启事务什么的,这就是AOP,面向编程的思想。

      AOP的术语:

         1、通知(Advice):就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下

         2、连接点(JoinPoint):这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。

         3、切入点(Pointcut):上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。

         4、切面(Aspect):切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

         5、引入(introduction):允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗

         6、目标(target):引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。

         7、代理(proxy):怎么实现整套aop机制的,都是通过代理,这个一会给细说。

         8、织入(weaving):把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。

北大青鸟java培训:动态SpringAOP的是如何实现的?

SpringAOP是利用代理模式,在运行时生成一个目标对象的代理,并且使用代理代替目标对象,整个过程对使用者透明,使用者无法像使用目标对象一样使用代理对象,代理对象类型是目标对象所属类的子类或者接口实现,广西IT培训认为这个子类也是在运行时动态生成,这个生成子类的过程使用操作字节码技术,Spring框架中使用两种字节码技术:JDK动态代理和CGLIB,当目标类实现了接口时使用JDK动态代理,否则使用CGLIB代理。

AOP的实现包含下面几个步骤:根据配置或注解解析切面。

生成AOP代理对象,给目标对象生成一个代理类以及代理类实例,根据解析出的切面,生成通知链设置到代理对象,在代理的回调中会执行通知链。

把AOP代理对象注册到容器中代替目标对象,当使用者向容器请求目标bean时,容器会返回代理对象。

 下面对这几个步骤逐一的分析。

切面解析在分析切面解析过程之前,首先先了解一下几个关键的接口,看下面的类图。

PointCut:描述切点,在进行切点匹配时,使用ClassFilter进行类匹配,MethodMatcher进行执行方法匹配。

Advice:通知,AfterAdvice后通知,BeforeAdvice前通知,DynamicIntroductionAdvice引用通知,环绕通知通过Interceptor实现。

Advisor:通知器,也就是切面,PointcutAdvisor切点通知器,IntroductionAdvisor引用通知器。

 在创建AOP代理之前需要把相关的切面配置解析成上面类图中的接口子类的对象,对于ProxyFactoryBean来说,没有这个过程,因为这种方式下不能使用切点。

切面解析完成之后,把解析出的通知添加通知链中,AOP代理对象引用该通知链执行切面通知逻辑。

对于aop标签方式和注解方式添加通知链这个动作的代码是类似的,解析切面这个过程有些差异。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。