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 提供了一个消息拦截器的接口,如下:

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

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