电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

关于AOP的应用实例


发布日期:2020/9/7
 

开发环境:Eclipse+JBossIDE

AOP的拦截器应用

新建AOP工程在新建向导中选择JBossAOP下的JBossAOP Project输入项目名为:TestAOPJava Version为Java 结束向导

系统自动生成AOP配置文件jbossaopxml文件内容如下:

<?xml version= encoding=UTF standalone=yes?>

<aop/>

新建Java类名为Test勾选main方法代码如下:

package test;

publicclass HelloAOP {

/**

*@paramargs

*/

publicstaticvoid main(String[] args) {

// TODO自动生成方法存根

HelloAOP hello= new HelloAOP();

hellosayHello();

}

publicvoid sayHello(){

Systemoutprintln(Hello);

}

}

新建拦截器名为HelloAOPInterceptorjava并实现Interceptor接口代码如下:

package test;

import orgjbossaopadviceInterceptor;

import orgjbossaopjoinpointInvocation;

publicclass HelloAOPInterceptor implements Interceptor {

public String getName() {

// TODO自动生成方法存根

returntestHelloAOPInterceptor;

}

public Object invoke(Invocation arg) throws Throwable {

// TODO自动生成方法存根

Systemoutprintln(HelloAOP!);

return arginvokeNext();

}

}

将拦截器和要拦截的类用设置文件联系起来包资源管理视图下右击类HelloAOP的sayHello方法在弹出菜单中选择JBoss AOP>Apply Interceptor(s)…在Select an Interceptor面板选择testHelloAOPInterceptor拦截器类系统自动更新jbossaopxml文件代码为:

<?xml version= encoding=UTF standalone=yes?>

<aop>

<bind pointcut=execution(public void testHelloAOP&gt;sayHello())>

<interceptor class=testHelloAOPInterceptor/>

</bind>

</aop>

右击HelloAOP类在弹出菜单中选择运行方式>运行…在对话框中选择JBoss AOP Application新建配置项单击运行按钮控制台出现如下信息:

HelloAOP!

Hello

即拦截器在sayHello方法调用前被调用

AOP的Advice应用

新建Java类名为:HelloAOPAspectjava代码如下:

package test;

import orgjbossaopjoinpointInvocation;

publicclass HelloAOPAdvice {

public Object trace(Invocation invocation) throws Throwable{

Systemoutprintln(进入程序运行点);

try {

return invocationinvokeNext();

}finally {

// TODO: handle exception

Systemoutprintln(离开程序运行点);

}

}

}

与HelloAOP文件联系起来包资源管理视图下右击类HelloAOP的sayHello方法在弹出菜单中选择JBoss AOP>Apply Advice…在Apply Advice…面板勾选Object trace(Invocation invocation)系统自动更新jbossaopxml文件代码为:

<?xml version= encoding=UTF standalone=yes?>

<aop>

<aspect class=testHelloAOPAdvice scope=PER_VM/>

<bind pointcut=execution(public void testHelloAOP&gt;sayHello())>

<interceptor class=testHelloAOPInterceptor/>

<advice aspect=testHelloAOPAdvice name=trace/>

</bind>

</aop>

利用刚新建的运行配置运行HelloAOPjava文件控制台出现如下信息:

HelloAOP!

进入程序运行点

Hello

离开程序运行点

从此处可看到Advice在Interceptor之后介入且方法sayHello()调用前后都起作用

AOP类中的域应用

修改HelloAOP代码添加私有变量message利用源代码菜单实现其Getter/Setter方法修改main方法完整代码如下:

package test;

publicclass HelloAOP {

/**

*@paramargs

*/

private String message=Welcome;

publicstaticvoid main(String[] args) {

// TODO自动生成方法存根

HelloAOP hello=new HelloAOP();

hellosayHello();

Systemoutprintln(hellogetMessage());

hellosetMessage(Benson);

Systemoutprintln(hellogetMessage());

}

publicvoid sayHello(){

Systemoutprintln(Hello);

}

public String getMessage() {

returnmessage;

}

publicvoid setMessage(String message) {

ssage = message;

}

}

包资源管理视图下右击类HelloAOP的域message在弹出菜单中选择JBoss AOP>Apply Interceptor(s)…在Select an Interceptor面板选择testHelloAOPInterceptor拦截器类系统自动更新jbossaopxml文件文件内容为:

<?xml version= encoding=UTF standalone=yes?>

<aop>

<aspect class=testHelloAOPAdvice scope=PER_VM/>

<bind pointcut=execution(public void testHelloAOP&gt;sayHello())>

<interceptor class=testHelloAOPInterceptor/>

<advice aspect=testHelloAOPAdvice name=trace/>

</bind>

<bind pointcut=field(private javalangString testHelloAOP&gt;message)>

<interceptor class=testHelloAOPInterceptor/>

</bind>

</aop>

利用刚新建的运行配置运行HelloAOPjava文件控制台出现如下信息:

HelloAOP!

HelloAOP!

进入程序运行点

Hello

离开程序运行点

HelloAOP!

Welcome

HelloAOP!

HelloAOP!

Benson

当域message被访问时(调用get或set时)都会调用拦截器可以看得出拦截器在对象初始化时对域message也起作用

利用相似的方法可以给域message设置advice包资源管理视图下右击类HelloAOP的域message在弹出菜单中选择JBoss AOP>Apply Advice…在Apply Advice…面板勾选Object trace(Invocation invocation)系统自动更新jbossaopxml文件代码为:

<?xml version= encoding=UTF standalone=yes?>

<aop>

<aspect class=testHelloAOPAdvice scope=PER_VM/>

<bind pointcut=execution(public void testHelloAOP&gt;sayHello())>

<interceptor class=testHelloAOPInterceptor/>

<advice aspect=testHelloAOPAdvice name=trace/>

</bind>

<bind pointcut=field(private javalangString testHelloAOP&gt;message)>

<interceptor class=testHelloAOPInterceptor/>

<interceptor class=testHelloAOPInterceptor/>

<advice aspect=testHelloAOPAdvice name=trace/>

</bind>

</aop>

利用刚新建的运行配置运行HelloAOPjava文件控制台出现如下信息:

HelloAOP!

HelloAOP!

进入程序运行点

离开程序运行点

HelloAOP!

进入程序运行点

Hello

离开程序运行点

HelloAOP!

HelloAOP!

进入程序运行点

离开程序运行点

Welcome

HelloAOP!

HelloAOP!

进入程序运行点

离开程序运行点

HelloAOP!

HelloAOP!

进入程序运行点

离开程序运行点

Benson

上一篇:基于RSA模型转换框架的开发

下一篇:EJB之JPA(EntityManager)