Topic: 面向方面编程的介绍----基本概念(1) |
Print this page |
1.面向方面编程的介绍----基本概念(1) | Copy to clipboard |
Posted by: Big Blue Posted on: 2003-06-03 09:24 面向对象的编程中常用的概念是:继承、封装、多态。在面向方面的编程中常使用的概念是:advices/interceptors, introductions, metadata, and pointcuts。 Advices/Interceptors(消息传达/消息拦截) 一个“传达的消息”是一个被特定事件触发发的逻辑(代码)。这个“传达的消息”可以被插入到一个调用者和被调用者队列之间。可以说:传达消息是面向方面的编程的一个关键组成部份。 Introductions(成员推荐) Introductions 是用来向已有的类增加方法和属性的一个方法。使用成员推荐你可以把一个现有类实现的接口“介绍”到另一个新的接口中。大家知道,接口的出现就是为了把定义和实现分开,现在使用面向方面的编程,可以做到动态改变既有类的接口,太不可思议了。在java编程中使用“成员推荐”你可以做到让一个java类实现多重继承。也就是说,使用“成员推荐”你可以在程序运行的时候来动态改变类的接口,实现不同的行为。就像孙悟空可以不断变换自己的行为,但是这个孙悟空必须有三个毫毛(被“成员推荐”)。看下面的例子: Apple apple = new Apple(); LoggingAPI logging = (LoggingAPI)apple; Apple.setLoggingLevel(VERBOSE); 使用“成员推荐”:Apple 可以动态的拥有log的功能了。 Metadata(元数据) 元数据是用来描述类本身的一些附加信息和其描述类捆绑在一起,可以静态的或者再运行的时刻获得这些类的描述信息。例子参见我的另一片文章(使用反射机制实现动态工厂模式)。EJB中就使用了大量的Metadata。 Pointcuts 如果说:interceptors, introductions, and metadata 是面向方面编程的特点的话,那么 pointcuts are 就是连接他们在一起的“胶水”。 Pointcuts 是运行在AOP框架,比如:告诉框架如何确认消息传达、元数据是如何在类中定义的、那些类、接口被“成员推荐”了等等。 |
2.面向方面编程的介绍----基本概念(2) [Re: Big Blue] | Copy to clipboard |
Posted by: Big Blue Posted on: 2003-06-03 09:26 Jboss 4.0 提供了AOP框架,这个框架是和Jboss应用服务器紧密集成的,但是也可以独立运行。 下面我们看看基于AOP编程的基本过程: 1、 定义“消息拦截器”Interceptor Jboss 提供了一个消息拦截器的接口,如下: public interface Interceptor { public String getName(); public InvocationResponse invoke ( Invocation invocation ) throws Throwable; } 值的一提的是:类中所有字段、构造函数、方法等的相关操作全部由“消息拦截器”拦截invoke,然后“打包”成一个Invocation对象,操作完成后返回IvvocationResponse对象。 详见下例: import org.jboss.aop.*; import java.lang.reflect.*; public class TracingInterceptor implements Interceptor { public String getName() { return TracingInterceptor; } public InvocationResponse invoke( Invocation invocation) throws Throwable { String message = null; if ( invocation.getType() == InvocationType.METHOD ) { Method method = MethodInvocation.getMethod(invocation); message = method: + method.getName(); } else if ( invocation.getType() == InvocationType.CONSTRUCTOR ) { Constructor c = ConstructorInvocation.getConstructor(invocation); message = constructor: + c.toString(); } else { return invocation.invokeNext(); } System.out.println(Entering + message); InvocationResponse rsp = invocation.invokeNext(); System.out.println(Leaving + message); return rsp; } } 2、 把“消息拦截器”和一个具体的类相关联 这里的关联用到上面提到的“胶水”pointcut,在xml配置文件中实现: 和J2EE配置文件名一样,AOP配置文件的命名是固定的:META-INF/jboss-aop.xml <?xml version="1.0" encoding="UTF-8"> <aop> <interceptor-pointcut class="POJO"> <interceptors> <interceptor class="TracingInterceptor" /> </interceptors> </interceptor-pointcut> </aop> 上面的代码把:TracingInterceptor消息拦截器和POJO类相关联。 POJO的代码如下: public class POJO { public POJO() {} public void helloWorld() { System.out.println(Hello World!); } public static void main( String[] args) { POJO pojo = new POJO(); pojo.helloWorld(); } } TracingInterceptor消息拦截器将会拦截:main(), POJO(), 和 helloWorld()方法。 编译后:使用控制台命令: java -Djava.system.class.loader=org.jboss.aop.standalone.SystemClassLoader POJO 输出的结果如下: Entering method: main Entering constructor: public POJO() Leaving constructor: public POJO() Entering method: helloWorld Hello World! Leaving method: helloWorld Leaving method: main JBOSS是如何做到上面的拦截的呢? AOP框架的作用如下: AOP 的框架的中心任务是:消息拦截interception和消息代理delegation。 AOP 框架具体完成两项工作: 1、组件激活(component activation ) 2、方法激活(Method invocation) 组件激活就是AOP框架构健一个aspect的对象实现,并返回一个(消息拦截)interceptor的引用(不是返回对对象的引用)。方法激活是当一个调用者调用(消息拦截)interceptor的时候,interceptor (消息拦截)的代理调用已经注册的aspect,然后返回被调用的object。 Jboss AOP框架是在字节代码的基础上进行上面的工作的。从实现上将就是对ClassLoader的完全控制,步步拦截,这些工作Jboss都已经做好了,当然如果你在Jboss 应用程序服务器之外运行的话,你不得不参照jboss的reference来自己实现classloader了。 |
3.美化(2)....:) [Re: Big Blue] | Copy to clipboard |
Posted by: chaos Posted on: 2003-06-13 00:02 Jboss 4.0 提供了AOP框架,这个框架是和Jboss应用服务器紧密集成的,但是也可以独立运行。 下面我们看看基于AOP编程的基本过程: 1、 定义“消息拦截器”Interceptor Jboss 提供了一个消息拦截器的接口,如下:
值的一提的是:类中所有字段、构造函数、方法等的相关操作全部由“消息拦截器”拦截invoke,然后“打包”成一个Invocation对象,操作完成后返回IvvocationResponse对象。 详见下例:
2、 把“消息拦截器”和一个具体的类相关联 这里的关联用到上面提到的“胶水”pointcut,在xml配置文件中实现: 和J2EE配置文件名一样,AOP配置文件的命名是固定的:META-INF/jboss-aop.xml
上面的代码把:TracingInterceptor消息拦截器和POJO类相关联。 POJO的代码如下:
TracingInterceptor消息拦截器将会拦截:main(), POJO(), 和 helloWorld()方法。 编译后:使用控制台命令: java -Djava.system.class.loader=org.jboss.aop.standalone.SystemClassLoader POJO 输出的结果如下:
JBOSS是如何做到上面的拦截的呢? AOP框架的作用如下: AOP 的框架的中心任务是:消息拦截interception和消息代理delegation。 AOP 框架具体完成两项工作: 1、组件激活(component activation ) 2、方法激活(Method invocation) 组件激活就是AOP框架构健一个aspect的对象实现,并返回一个(消息拦截)interceptor的引用(不是返回对对象的引用)。方法激活是当一个调用者调用(消息拦截)interceptor的时候,interceptor (消息拦截)的代理调用已经注册的aspect,然后返回被调用的object。 Jboss AOP框架是在字节代码的基础上进行上面的工作的。从实现上将就是对ClassLoader的完全控制,步步拦截,这些工作Jboss都已经做好了,当然如果你在Jboss 应用程序服务器之外运行的话,你不得不参照jboss的reference来自己实现classloader了。 |
4.Re:面向方面编程的介绍----基本概念(1) [Re: Big Blue] | Copy to clipboard |
Posted by: flyfan Posted on: 2003-06-20 11:29 有用,但曲高和寡! |
5.Re:面向方面编程的介绍----基本概念(1) [Re: Big Blue] | Copy to clipboard |
Posted by: zlzj2010 Posted on: 2003-06-20 14:48 不错,up一下 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |