`

AspectJ1(转载)

阅读更多

 

(转载)http://www.iteye.com/topic/31023

软件环境 : Eclipse3.1.1 , AJDT 1.3 , JDK1.4.2 , AspectJ1.5, Struts1.1 , Jetty5.1.6

场景介绍 : workspace中已存在一个java项目,并已部署与Jetty服务器上,这里我采用了一个简单的struts项目,我将演示如何在不改变原有项目的任何代码和配置的基础上,在runtime对struts项目中的一些代码进行拦截。

首先,让我们来新建已个AspectJ项目,名字为AspectJDemo。

在新建project的build path中加入aspectjrt.jar

Aspectj InPath中加入aspectj代码中需要用到的类及jar,这边我加入了struts的所有jar及StrutsDemo的类编译路径

好,接下来说一下我要拦截的代码片断,在原项目中有一个名叫UserLoginForm的FormBean,希望在runtime的时候,当struts调用这个form中的setUsername方法时拦截代码,相关的struts代码如下:

Java代码 复制代码
  1. public class UserLoginForm extends ActionForm {   
  2.     private String username;   
  3.     private String password;   
  4.        
  5.     public String getPassword() {   
  6.         return password;   
  7.     }   
  8.     public void setPassword(String password) {   
  9.         this.password = password;   
  10.     }   
  11.     public String getUsername() {   
  12.         return username;   
  13.     }   
  14.     public void setUsername(String username) {   
  15.         this.username = username;   
  16.     }      
  17. }  
public class UserLoginForm extends ActionForm {
	private String username;
	private String password;
	
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}	
}

Java代码 复制代码
  1. public class UserLoginAction extends Action {   
  2.     private final String LOGIN_FAILURE = "failure";   
  3.     private final String LOGIN_SUCCESS = "success";   
  4.        
  5.     public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {   
  6.     UserLoginForm ulf = (UserLoginForm)form;   
  7.     LOG.info("Username:"+ulf.getUsername()+"+Password:"+ulf.getPassword());   
  8.            
  9.     return mapping.findForward(LOGIN_FAILURE);   
  10. }   
  11. }  
public class UserLoginAction extends Action {
	private final String LOGIN_FAILURE = "failure";
	private final String LOGIN_SUCCESS = "success";
	
	public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
	UserLoginForm ulf = (UserLoginForm)form;
	LOG.info("Username:"+ulf.getUsername()+"+Password:"+ulf.getPassword());
		
	return mapping.findForward(LOGIN_FAILURE);
}
}

Java代码 复制代码
  1. <html:form action="/login" focus="username" onsubmit="">   
  2. <table border="0" width="100%">   
  3. <tr>   
  4.     <th align="right">Username:</th>   
  5.     <td align="left">   
  6.     <html:text property="username" size="16" maxlength="18" />   
  7.     </td>   
  8. </tr>   
  9. <tr>   
  10.     <th align="right">Password:</th>   
  11.     <td align="left">   
  12.     <html:password property="password" size="16" maxlength="18" redisplay="false" />   
  13.     </td>   
  14. </tr>   
  15. <tr>   
  16.     <td align="right"><html:submit value="Submit" /></td>   
  17.     <td align="left"><html:reset /></td>   
  18. </tr>   
  19. </table>   
  20. </html:form>  
<html:form action="/login" focus="username" onsubmit="">
<table border="0" width="100%">
<tr>
	<th align="right">Username:</th>
	<td align="left">
	<html:text property="username" size="16" maxlength="18" />
	</td>
</tr>
<tr>
	<th align="right">Password:</th>
	<td align="left">
	<html:password property="password" size="16" maxlength="18" redisplay="false" />
	</td>
</tr>
<tr>
	<td align="right"><html:submit value="Submit" /></td>
	<td align="left"><html:reset /></td>
</tr>
</table>
</html:form>

OK,现在让我们在AspectJDemo中建一个aspect吧
Java代码 复制代码
  1. public aspect LoginAspect {   
  2.     //建立一个pointcut,这个pointcut对所有方法签名为    
  3.      //public void setUsername(String) 的方法被执行的时候有效   
  4.     public pointcut setUsername() :   
  5.         execution (public void setUsername(String));   
  6.     //设定拦截位置,在setUsername这个pointcut执行前打印出一段message   
  7.     before() : setUsername() {   
  8.         System.out.println("setUsername method has been invoked!!!");   
  9.     }   
  10. }  
public aspect LoginAspect {
    //建立一个pointcut,这个pointcut对所有方法签名为 
     //public void setUsername(String) 的方法被执行的时候有效
    public pointcut setUsername() :
    	execution (public void setUsername(String));
    //设定拦截位置,在setUsername这个pointcut执行前打印出一段message
    before() : setUsername() {
    	System.out.println("setUsername method has been invoked!!!");
    }
}

接下来,我们需要一些配置文件,首先在StrutsDemo下我们新建一个Jetty5.xml的jetty配置文件,当然这个文件可以拷贝jetty_home/ect/jetty.xml,但必须定义你项目的context
Java代码 复制代码
  1. <Call name="addWebApplications">   
  2.     <Arg></Arg>   
  3.     <Arg>./webapp/</Arg>   
  4.     <Arg><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Arg>   
  5.     <Arg type="boolean">true</Arg><!--extract WARs-->   
  6.     <Arg type="boolean">false</Arg><!-- java 2 compliante class loader -->   
  7.   </Call>  
<Call name="addWebApplications">
    <Arg></Arg>
    <Arg>./webapp/</Arg>
    <Arg><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Arg>
    <Arg type="boolean">true</Arg><!--extract WARs-->
    <Arg type="boolean">false</Arg><!-- java 2 compliante class loader -->
  </Call>

然后在AspectJDemo/src/META-INF下建立aop.xml,定义我们的aspect列表
Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <aspectj>   
  3.     <aspects>   
  4.         <aspect name="lenson.presentation.LoginAspect"/>   
  5.     </aspects>   
  6. </aspectj>  
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
	<aspects>
		<aspect name="lenson.presentation.LoginAspect"/>
	</aspects>
</aspectj>

代码都写完了,我们怎么让我们的setUsername方法在runtime时被拦截呢?我们需要对Jetty服务器启动方式进行一些改变,让我们来新建一个AspectJ Load-Time Weaving Application,非常类似于Java Application

选中StrutsDemo项目,当然我们需要在classpath中加入jetty运行时所需要的jar

然后,我们需要把我们的AspectJDemo放到LTW Aspectpath中

最后,我们需要设定Jetty启动时所需要的arguments

Jetty Home Path
Java代码 复制代码
  1. -Djetty.home="D:\development\jetty-5.1.6"  
-Djetty.home="D:\development\jetty-5.1.6"

jetty.xml Path (注意我的working directory都在StrutsDemo下)
Java代码 复制代码
  1. ./jetty5.xml  
./jetty5.xml

大功告成,点run运行一下我们的项目吧。访问jsp,提交你的表单
Java代码 复制代码
  1. setUsername method has been invoked!!!   
  2. 21:51:59,211  INFO UserLoginAction:22 - Username:test+Password:test  
分享到:
评论

相关推荐

    Android Studio AspectJ技术1

    1. 分析用户交互行为:AspectJ 可以帮助开发者分析用户交互行为,包括用户界面点击、触摸、切换等交互行为。这可以帮助开发者更好地理解用户行为,优化应用程序的用户体验。 2. 分析 APP 性能:AspectJ 可以帮助...

    Aspectj

    1. **面向切面编程(AOP)**: AOP是软件工程中的一种编程范式,旨在减少代码的冗余和提高可维护性。通过分离关注点,将横切关注点(如日志、异常处理等)从核心业务逻辑中解耦出来。 2. **AspectJ语法**: AspectJ提供...

    aspectJ

    1. **切点(Pointcut)**:切点是程序中特定的执行点,例如方法的调用、异常的抛出等。AspectJ提供了强大的表达式语言来精确地指定切点,这样我们就可以在需要的地方插入我们的关注点。 2. **通知(Advice)**:...

    aspectj-1.9.6.jar

    1. **静态织入**:使用ajc编译器在编译时直接将切面织入到字节码中,生成的类可以直接在Java虚拟机(JVM)上运行。 2. **动态织入**:在类加载时或运行时,通过代理模式实现切面的织入。这使得可以在不重新编译源...

    aspectj-1.7.0.jar

    aspectj-1.7.0.jar aspectj的包

    精通AspectJ_源代码

    1. **切面(Aspect)**:切面是AspectJ的核心,它封装了系统中的一个关注点,例如数据验证、事务管理等。切面由通知(advice)、切点(pointcut)和引入(introduction)组成。 2. **通知(Advice)**:这是切面...

    aspectj-1.6.9.jar

    1. **织入机制**:AspectJ 提供了两种织入方式——编译时织入和运行时织入。编译时织入是通过AspectJ的编译器ajc将切面代码合并到目标类中,生成新的字节码;运行时织入则是在程序运行时,通过AspectJ的加载器动态地...

    AspectJ的JAR包

    1. `aspectjweaver.jar`:这是AspectJ的核心库,它包含了一组编译器和类装载器,能够在运行时或者编译时处理AspectJ代码。AspectJ Weaver在Spring AOP中起到关键作用,它可以动态地在类加载时织入切面,即使目标类...

    Aop之AspectJ详解解读demo

    1. **引入依赖**:在Maven项目中,需要添加AspectJ的依赖库。 2. **编写切面**:创建一个类并使用`@Aspect`注解标记为切面。然后定义切点和通知。 ```java @Aspect public class LoggingAspect { @Before(...

    aspectj jar

    1. 添加依赖:首先,确保在项目的构建配置(如Maven的pom.xml或Gradle的build.gradle)中添加AspectJ的依赖。这通常包括`aspectjrt.jar`和`aspectjweaver.jar`,它们分别提供了运行时环境和织入功能。 2. 配置织入...

    org.aspectj,aspectj项目库(org.aspectj).zip

    1. **README**:项目的基本介绍,包括如何构建、运行和贡献代码的说明。 2. **src**:源代码目录,分为`main`和`test`两部分,分别存放主要代码和测试代码。 3. **build.gradle**或pom.xml:构建文件,用于指定项目...

    AspectJ面向切面的例子

    1. `src`目录:源代码,包括Java类和AspectJ切面定义。 2. `lib`目录:可能包含AspectJ的库文件,如`aspectjrt.jar`和`aspectjweaver.jar`。 3. `build.xml`或`pom.xml`:构建脚本,用于编译和运行程序,可能使用Ant...

    aspectj,aspectjrt,weaver等

    1. 如何创建切面:切面是封装横切关注点的类,包含通知(advice)和切点(pointcut)定义。 2. 通知类型:包括前置通知(before)、后置通知(after)、返回通知(after returning)、异常通知(after throwing)和...

    AspectJ_Cookbook_English_edition

    1. **AspectJ基础**:介绍AspectJ的基本元素,包括切面、通知(advice)、连接点(join point)、切点(pointcut)和织入(weaving)。这些概念构成了AspectJ的基础,理解它们是使用AspectJ的前提。 2. **切面和...

    book :aspectj in action

    1. 面向切面编程的基本理念和历史背景。 2. AspectJ语法和编程模型,包括定义切面、通知类型(before、after、around等)以及切入点表达式。 3. 如何在Java项目中引入和使用AspectJ,包括静态和动态编织的区别。 4. ...

    spring aspectj.jar

    1. 定义切面:使用`@Aspect`注解声明一个类为切面,然后在这个类中定义切点和通知。 2. 定义切点:切点是程序执行中的特定点,可以使用正则表达式或者预定义的切入点表达式来定义。 3. 定义通知:通知是在切点匹配时...

    AspectJ经典实例详解

    1. **日志记录**:创建一个切面,当方法被调用时,自动记录日志。这可以避免在每个需要记录日志的地方重复插入代码。 ```java @Aspect public class LoggingAspect { @Before("execution(* ...

    aspectj-1.9.5.jar

    aspectj-1.9.5.jar 官网下载地址:https://www.eclipse.org/aspectj/downloads.php

    AspectJ 文档

    AspectJ是一个功能强大的面向切面编程(AOP)框架,它允许开发者以声明的方式在Java程序中定义横切关注点(cross-cutting concerns),如日志记录、事务管理等。AOP通过引入切面(aspects)来模块化这些关注点,而切...

Global site tag (gtag.js) - Google Analytics