`
hyaci2011
  • 浏览: 1161 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Aspectj some problems

阅读更多

  最近在研究 面向切面编程 这个话题;后来发现Aspectj是AOP 中比较早 的实现。学习中发现我很是不理解的问题:

     1.在Eclipse_helio 版本的 ajdt中 使用 aspect 关键字 硬编码 和@Aspect 声明式编码方式 前者能很好运行 后者则出  现了我很不理解的问题..

     2.aspectj有自己的编译原理 那么她怎么和普通的项目进行整合?就比如说 建立一个简单的WEB 工程 想在Servlet

 里面的doGet 和 doPost 执行之前 进行 页面参数的验证 怎样才能 使*.aj 文件注入 servlet里面

   3. aspectj已经出现了很长一段时间了为什么没有流行起来 反倒是 spring 支持Aspectj 的@Annotation 的AOP比较流行?

 

关于第1个问题 代码:

   代码思路是 对pojo的属性进行监控。

    pojo(简单的getter setter)

package example.bean.exer.pojo;

public class EntityBean{
	private String id;
	private String name;
	private String descrtion;
 
package example.bean.exer.pojo;

public class Father {
	private String id;
 
package example.bean.exer.pojo;

public class Sun extends Father {
	private String name;
	private int age;
	private double money;
 

 

    PropertyChangeListener

package example.bean.exer;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
//@Other
public class BeanPropertyListner implements PropertyChangeListener {

	@Override
	public void propertyChange(PropertyChangeEvent evt) {
		// TODO Auto-generated method stub
		System.out.println("监听 :"+evt.getPropertyName()+" oldValue:"+evt.getOldValue()+" newValue:"+evt.getNewValue());
	}

}
 

    切面(硬编码)

 

package example.bean.exer;

import java.beans.PropertyChangeSupport;
import java.lang.reflect.Method;

public aspect BeanAspect {
	
//	declare @method :execution(public *.new(..));
	
//	declare @type :example.bean.exer.*:@Enity;
//	declare parents : (@Enity *) extends Father;
	public interface PropertyChange{};
	//给EntityBean 注入一个support 的属性
	private PropertyChangeSupport PropertyChange.support = new PropertyChangeSupport(this);
//	//给EntityBean 注入一个doSay方法。
	public PropertyChangeSupport PropertyChange.getSupport(){
		return support;
	}
	
	declare parents :example.bean.exer.pojo.* implements PropertyChange;
	
	pointcut testconMethod(): execution(public example.bean.exer.pojo.*.new(..));
	before():testconMethod(){
		PropertyChange eb=(PropertyChange)thisJoinPoint.getTarget();
		eb.support.addPropertyChangeListener(new BeanPropertyListner());
	}
	pointcut testOtherMethod():execution(* example.bean.exer.pojo.*.set*(..));
	before():testOtherMethod(){
		PropertyChange eb=(PropertyChange)thisJoinPoint.getTarget();
		String methodName=thisJoinPoint.getSignature().getName();
		String fieldName=methodName.substring(3);
		String getterName="get"+fieldName;
		Object o=null;
		try{
			Method m=eb.getClass().getMethod(getterName, null);
			o=m.invoke(eb, null);
		}catch(Exception e){
			e.printStackTrace();
		}
		eb.support.firePropertyChange(fieldName,o,thisJoinPoint.getArgs()[0]);
	}
	
	
}

切面(声明annotation)

package example.bean.exer;

import java.beans.PropertyChangeSupport;
import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.DeclareParents;
import org.aspectj.lang.annotation.Pointcut;

@SuppressWarnings("unused")
@Aspect
public class ModelFieldKeeping {
	public interface PropertyChange{
		PropertyChangeSupport getSupport();
	}
	public static class PropertyChangeImpl implements PropertyChange{
		private PropertyChangeSupport support=new PropertyChangeSupport(this);
		@Override
		public PropertyChangeSupport getSupport() {
			// TODO Auto-generated method stub
			return support;
		}
	}
	
	@DeclareParents(value="example.bean.exer.pojo.*",defaultImpl=PropertyChangeImpl.class)
	private PropertyChange implementedInterface;
	
	@Pointcut("execution(public example.bean.exer.pojo.*.new(..))")
	private void constructorMethod(){}
	@Pointcut("execution(* example.bean.exer.pojo.*.set*(..))")
	private void setMethod(){}
	
	@Before("constructorMethod()")
	public void addListner(JoinPoint jp){
		PropertyChange eb=(PropertyChange)jp.getTarget();
		eb.getSupport().addPropertyChangeListener(new BeanPropertyListner());
	}
	@Before("setMethod()")
	public void fireListner(JoinPoint jp){
		PropertyChange eb=(PropertyChange)jp.getTarget();
		//fieldName
		String methodName=jp.getSignature().getName();
		String fieldName=jp.getTarget().getClass().getName()+"."+methodName.substring(3);
		//获取原来值
		String getterName="get"+methodName.substring(3);
		Object o=null;
		try{
			Method m=eb.getClass().getMethod(getterName, null);
			o=m.invoke(eb, null);
		}catch(Exception e){
			e.printStackTrace();
		}
		eb.getSupport().firePropertyChange(fieldName,o,jp.getArgs()[0]);
	}
}
 

测试:采用硬编码方式 可以完美输出 但是采用 声明式 则出现 pojo 的方法不能用 我反编译了.class 文件觉得是么的问题的..

package example.bean.exer;

import example.bean.exer.pojo.EntityBean;
import example.bean.exer.pojo.Father;
import example.bean.exer.pojo.Sun;

//@Other
public class MainTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		EntityBean eb = new EntityBean();
		eb.getClass();
		eb.setId("sssssssssssss");
		eb.setName("ss");
		System.out.println(eb.getId());
		System.out.println(eb.getName());
		Father f = new Father();
		System.out.println(f.getSupport());
		Sun sun = new Sun();
		sun.setAge(9);
		sun.setId("id。。。");
		sun.setMoney(0.1234);
		sun.setName("hyaci");
		System.out.println(sun.getSupport());
	}

}

 以上问题 希望ITeye 的各位朋友 帮忙解决...谢

分享到:
评论
2 楼 hell74111 2011-12-24  
你好啊,我现在有个需求就是要对众多的pojo的属性进行监控,一旦pojo调用了set方法,则触发某个操作。

如果通过在所有的set方法中加入firePropertyChange 通知监听者,当然可以实现,但要在每一个pojo类的set方法中加入这个代码,实在不能认同这种模式

如果不修改pojo代码,能否给pojo的set方法注入firePropertyChange动作,当set执行的时候,自动的执行firePropertyChange?????

我看spring的AOP拦截器,可以拦截方法,但由于是通过代理方式进行的,只支持对接口的编程,而且在客户端调用的时候,只能通过接口进行调用,不能满足我的要求。


所以想问您,是否有解决的方法,多谢!!!!
1 楼 hyaci2011 2011-11-04  
哎 么人理哎..对于第一个问题 ---可能是AJDT 的问题
理由:尽管在Exlipse helio 里面不能有提示的调用方法 但是手动的把方法写上(虽然Eclipse 这时候在报错) 但是在执行的时候 还是会执行
对于第2个问题 ---可以使用 Eclipse 的 项目右键 config.. 转换为Aspecj模式就行了 (在编译期的时候就织入了切面) 我在研究第2个问题的解决办法的时候发现了Aspectj  的LTW 好像能更好来处理这个问题 但是我没有实践成功..
对于第3个问题  我在想可能是 运行期织入的原因 Aspectj 并么有提供运行期织入的支持..但是为什么广大的java 使用者 很看好运行期织入?
希望有人来讨论..

相关推荐

    Aspectj

    AspectJ是一种广泛使用的Java语言的面向切面编程(AOP)扩展。它允许开发者将关注点模块化,使得系统中的交叉切面(如日志、事务管理、安全性等)可以独立于核心业务逻辑进行处理。本指南将深入探讨AspectJ的核心概念...

    aspectj-1.9.6.jar

    《AspectJ 1.9.6.jar:Java AOP编程的基石》 AspectJ是Java平台上的一种面向切面编程(AOP)框架,它允许开发者将关注点分离,提高代码的可维护性和可复用性。AspectJ 1.9.6.jar文件是AspectJ库的核心组成部分,它...

    aspectj-1.7.0.jar

    aspectj-1.7.0.jar aspectj的包

    aspectJ

    AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更有效地处理横切关注点,即那些跨越多个类或方法,不易封装的传统OOP难以处理的问题,如日志、事务管理、性能监控等。在本资料中...

    精通AspectJ_源代码

    AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更方便地处理系统中的横切关注点,如日志、事务管理、安全性等。本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,...

    aspectj-1.6.9.jar

    AspectJ 是一个强大的面向切面编程(AOP)的框架,它允许开发者在Java应用程序中分离关注点,将横切逻辑(如日志、事务管理、安全性等)与核心业务逻辑相分离。`aspectj-1.6.9.jar` 是AspectJ框架的一个特定版本,即...

    aspectj jar

    AspectJ和Spring的整合在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)时。AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑...

    AspectJ的JAR包

    AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许开发者在不改变原有代码结构的情况下,插入关注点代码。在Spring AOP框架中,AspectJ被广泛用于实现更精细粒度的切面逻辑,提供比Spring默认的...

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

    【标题】"org.aspectj,aspectj项目库(org.aspectj).zip" 提供的是开源项目AspectJ的源码库。AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许程序员以声明式方式处理系统的横切关注点,如日志...

    aspectj,aspectjrt,weaver等

    AspectJ、AspectJRT 和 AspectWeaver 是三个与面向切面编程(AOP)相关的关键组件,它们在Spring框架中有着重要应用,尤其对于初学者来说,理解这些概念是掌握Spring AOP的基础。 AspectJ 是一个强大的Java语言的...

    Aop之AspectJ详解解读demo

    **Aop之AspectJ详解解读** 在软件开发中,面向切面编程(AOP)是一种设计模式,它允许程序员将关注点分离到不同的模块,从而提高代码的可维护性和复用性。AspectJ是Java平台上的一个开源AOP框架,它提供了一种强大...

    AspectJ面向切面的例子

    AspectJ是Java平台上的一个开源框架,它为Java开发者提供了强大的AOP支持,使我们能够方便地定义和实现切面。 标题"AspectJ面向切面的例子"指的是通过AspectJ实现的一个实际项目,这个例子是一个名为"Spacewar"的小...

    aspectj-1.9.5.jar

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

    book :aspectj in action

    《AspectJ in Action》是一本深入探讨面向切面编程(Aspect-Oriented Programming, AOP)的权威书籍,由Eric Evans和Manning Publications在2003年出版。该书详细介绍了AspectJ这一强大的Java语言扩展,它允许开发者...

    AspectJ_Cookbook_English_edition

    《AspectJ Cookbook》是一本专为开发者准备的指南,它深入介绍了AspectJ这一强大的面向切面编程(AOP)框架。面向切面编程是一种编程范式,旨在提高软件的可维护性和可重用性,通过将关注点分离,使得业务逻辑与系统...

    AspectJ 文档

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

    spring aspectj.jar

    《Spring AOP与AspectJ深度解析》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的面向切面编程(AOP)特性极大地简化了代码的维护和扩展。AspectJ是Spring AOP的重要组成部分,...

    AspectJ经典实例详解

    AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志、事务管理等模块化,实现代码的解耦。AOP的核心理念是将横切关注点(如日志、异常处理等)与业务逻辑...

    Android Studio AspectJ技术1

    AspectJ 在 Android Studio 中的应用 AspectJ 是一种面向 Aspect 编程语言,用于在 Java 语言中实现面向方面编程。AspectJ 可以帮助开发者更好地理解和优化 Android 应用程序的性能和行为。在 Android Studio 中...

Global site tag (gtag.js) - Google Analytics