`
lenson
  • 浏览: 2681 次
  • 来自: 上海
社区版块
存档分类
最新评论

AspectJ 学习笔记(一)

    博客分类:
  • AOP
阅读更多
软件环境 : 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代码如下:
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;
	}	
}

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);
}
}

<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吧
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
<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列表
<?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
-Djetty.home="D:\development\jetty-5.1.6"

jetty.xml Path (注意我的working directory都在StrutsDemo下)
./jetty5.xml

大功告成,点run运行一下我们的项目吧。访问jsp,提交你的表单
setUsername method has been invoked!!!
21:51:59,211  INFO UserLoginAction:22 - Username:test+Password:test

WOW~~~
希望这片文章对刚起步开始学aspectj的朋友有些帮助。
分享到:
评论
3 楼 yananay 2007-06-18  
lenson 写道
    说一下我开始学习aspectj的初衷和目的吧,在一个大型项目中人往往会不由自主,框架是老外写的,环境也是老外维护的。访问数据库或者其他环境的ID有着严格的限制,还时不时的需要重新申请,使用的框架和环境紧密耦合,种种限制让我们的team无法快速的开发,导致开发人员因种种原因需要不断加班。在改变框架为不可能的前提下,我有个想法,就是利用AspectJ及Spring对AspectJ的支持写一套runtime mocking的东西,完全无侵入性,只是在runtime的时候去mock环境或框架依赖特别严重的代码,这样开发的时候不需要为不能访问数据库等问题操心了。
    这个demo我想解决的问题是,aspectj的代码对原有代码完全无侵入性,这样开发出来的代码可以纹丝不动的部署到生产环境中去。
    不知大家对我的想法有什么建议和意见?


你们难道没有自己的DEV环境吗。。。?
2 楼 insky 2007-06-18  
=========================
然后在AspectJDemo/src/META-INF下建立aop.xml,定义我们的aspect列表

代码
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<aspect name="lenson.presentation.LoginAspect"/>
</aspects>
</aspectj>
=========================
请教楼主,META-INF下建立aop.xml这个是必须的吗?我运行的时候怎么没进行这个步骤就可以顺利跑起来?也有点迷惑 没有设置aspectj.property  没有设置aop.list or aop.xml程序是如何关联aspectj的呢? 同楼主 我只用到了AJDT插件
1 楼 lenson 2006-10-28  
    说一下我开始学习aspectj的初衷和目的吧,在一个大型项目中人往往会不由自主,框架是老外写的,环境也是老外维护的。访问数据库或者其他环境的ID有着严格的限制,还时不时的需要重新申请,使用的框架和环境紧密耦合,种种限制让我们的team无法快速的开发,导致开发人员因种种原因需要不断加班。在改变框架为不可能的前提下,我有个想法,就是利用AspectJ及Spring对AspectJ的支持写一套runtime mocking的东西,完全无侵入性,只是在runtime的时候去mock环境或框架依赖特别严重的代码,这样开发的时候不需要为不能访问数据库等问题操心了。
    这个demo我想解决的问题是,aspectj的代码对原有代码完全无侵入性,这样开发出来的代码可以纹丝不动的部署到生产环境中去。
    不知大家对我的想法有什么建议和意见?

相关推荐

    spring aop 学习笔记

    本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...

    Spring学习笔记

    ### Spring学习笔记:深入理解AOP与Annotation驱动的动态代理 #### 核心知识点解析: 在探讨Spring框架中AOP(面向切面编程)及基于Annotation的动态代理之前,我们首先需要了解AOP的基本概念及其在Spring中的实现...

    Spring2.5学习笔记

    ### Spring2.5 学习笔记详解 #### 一、Spring 框架简介 Spring 是一个开源的轻量级 Java 开发框架,主要用于简化企业级应用的开发工作。Spring 提供了一系列强大的功能,比如控制反转 (Inversion of Control, IOC)...

    Spring2.5_学习笔记.doc.zip

    《Spring2.5 学习笔记》是一份深入解析Spring框架2.5版本的文档,旨在帮助开发者全面理解和掌握这一经典版本的核心特性与应用实践。Spring作为Java领域中最流行的轻量级框架之一,其2.5版本在当时的发布带来了许多...

    spring2.5 学习笔记

    【Spring 2.5 学习笔记】 在深入学习Spring 2.5的过程中,我们可以了解到一系列关键的概念和技术。首先,面向抽象编程是Spring的核心理念之一,它鼓励开发者编写可重用且松散耦合的代码,通过接口而非具体实现进行...

    spring mvc学习笔记

    ### Spring MVC 学习笔记之 AOP 面向切面编程详解 #### 一、AOP 概念概述 面向切面编程(Aspect Oriented Programming, AOP)是一种编程范式,它允许程序员定义“切面”来封装那些与业务逻辑本身无关的功能,比如...

    spring 学习笔记 32页word

    【Spring 学习笔记概述】 Spring 是一个广泛使用的 Java 应用框架,尤其在企业级应用开发中占有重要地位。其核心特性是依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC),这两者是...

    Spring2.5.6学习笔记-最新

    以上是 Spring 2.5.6 学习笔记中的关键知识点,通过这些基础知识的学习,开发者可以开始构建基于 Spring 框架的应用程序。接下来,可以进一步深入学习 Spring 的高级特性,如事务管理、安全性、Web 开发等方面的知识...

    《java学习》-java后端学习笔记.zip

    这份《java学习》-java后端学习笔记.zip压缩包包含了多个关键主题,旨在帮助初学者和有经验的开发者深入理解Java编程语言及其在后端应用中的实践。以下是这些主题的详细解析: 1. Git&GitHub.pdf:版本控制系统Git...

    Spring2.0学习笔记

    【Spring2.0学习笔记】 在深入探讨Spring2.0的知识点之前,首先理解几个核心概念至关重要。Spring框架的核心设计理念是控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。IoC意味着...

    传智播客Spring2.5.6学习笔记最新整理

    ### Spring2.5.6 学习笔记精粹解析 #### 一、Spring框架环境搭建与JAR包配置 在开始深入Spring框架的学习之前,首先需要确保开发环境正确配置Spring框架。按照“传智播客Spring2.5.6学习笔记最新整理”的指引,...

    spring 学习笔记

    下面将根据“spring 学习笔记”的主题,对Spring框架进行深入的探讨。 一、依赖注入(DI) 依赖注入是Spring的核心功能,它允许对象之间的依赖关系在运行时动态地管理和配置,而不是在代码中硬编码。这样可以提高...

    spring学习笔记(十三)

    【标题】"Spring学习笔记(十三)"主要涉及的是Spring框架中的AOP(面向切面编程)部分,特别是关于CGLIB动态代理的实现。在Spring中,AOP是一种强大的编程模型,它允许开发者定义“切面”,即关注点的模块化,如日志...

    spring2.0学习笔记+spring定时任务

    标题中的“spring2.0学习笔记+spring定时任务”表明了这个压缩包文件包含的是关于Spring框架2.0版本的学习资料,特别是关于Spring的定时任务功能。Spring是Java开发中最广泛应用的轻量级框架之一,它提供了一整套...

    spring学习笔记LBY.pdf

    ### Spring学习笔记知识点详解 #### 一、Spring学习模块概览 Spring框架作为一个全面而强大的企业级应用开发框架,其内部包含多个模块,这些模块分别针对不同的应用场景和技术领域进行了优化设计。了解这些模块有...

    SpringAop学习笔记以及实现Demo

    **Spring AOP 学习笔记及实现Demo** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP的主要目的...

Global site tag (gtag.js) - Google Analytics