- 浏览: 1658503 次
- 性别:
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
目前整个开发社区对AOP(Aspect Oriented
Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP
等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP。本文不是要在理论上具体阐述何为AOP,
为何要进行AOP . 要详细了解学习AOP可以到它老家http://aosd.net
去瞧瞧。这里只是意图通过一个简单的例子向初学者展示一下如何来进行AOP.
为了简单起见,例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP.
让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全
控
制,事务处理等方面。它的主要意图就要将日志记录,性能统计,安全控制等等代码从商业逻辑代码中清楚的划分出来,我们可以把这些行为一个一个单独看作系统
所要解决的问题,就是所谓的面向问题的编程(不知将AOP译作面向问题的编程是否欠妥)。通过对这些行为的分离,我们希望可以将它们独立地配置到商业方法
中,而要改变这些行为也不需要影响到商业方法代码。
假设系统由一系列的BusinessObject所完成业务逻辑功能,系统要求在每一次业务逻辑处理时要做日志记录。这里我们略去具体的业务逻辑代码。
public interface BusinessInterface {
public void processBusiness();
}
public class BusinessObject implements BusinessInterface {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void processBusiness(){
try {
logger.info("start to processing...");
//business logic here.
System.out.println(“here is business logic”);
logger.info("end processing...");
} catch (Exception e){
logger.info("exception happends...");
//exception handling
}
}
}
这里处理商业逻辑的代码和日志记录代码混合在一起,这给日后的维护带来一定的困难,并且也会造成大量的代码重复。完全相同的log代码将出现在系统的每一个BusinessObject中。
按照AOP的思想,我们应该把日志记录代码分离出来。要将这些代码分离就涉及到一个问题,我们必须知道商业逻辑代码何时被调用,这样我们好插入日志记录代 码。一般来说要截获一个方法,我们可以采用回调方法或者动态代理。动态代理一般要更加灵活一些,目前多数的AOP Framework也大都采用了动态代理来实现。这里我们也采用动态代理作为例子。
JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理 器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会 被自动调用。
有了JDK的这种支持,我们所要做的仅仅是提供一个日志处理器。
public class LogHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
public LogHandler(Object delegate){
this.delegate = delegate;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object o = null;
try {
logger.info("method stats..." + method);
o = method.invoke(delegate,args);
logger.info("method ends..." + method);
} catch (Exception e){
logger.info("Exception happends...");
//excetpion handling.
}
return o;
}
}
现在我们可以把BusinessObject里面的所有日志处理代码全部去掉了。
public class BusinessObject implements BusinessInterface {
private Logger logger = Logger.getLogger(this.getClass().getName());
public void processBusiness(){
//business processing
System.out.println(“here is business logic”);
}
}
客户端调用商业方法的代码如下,
BusinessInterface businessImp = new BusinessObject();
InvocationHandler handler = new LogHandler(businessImp);
BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance(
businessImp.getClass().getClassLoader(),
businessImp.getClass().getInterfaces(),
handler);
proxy.processBusiness();
程序输出如下:
INFO: method stats...
here is business logic
INFO: method ends...
至此我们的第一次小尝试算是完成了。可以看到,采用AOP之后,日志记录和业务逻辑代码完全分开了
,以后要改变日志记录的话只需要修改日志记录处理器就行了,而业务对象本身(BusinessObject)无需做任何修改。并且这个日志记录不会造成重复代码了,所有的商业处理对象都可以重用这个日志处理器。
当然在实际应用中,这个例子就显得太粗糙了。由于JDK的动态代理并没有直接支持一次注册多个InvocationHandler,那么我们对业务处理方 法既要日志记录又要性能统计时,就需要自己做一些变通了。一般我们可以自己定义一个Handler接口,然后维护一个队列存放所有Handler, 当InvocationHandler被触发的时候我们依次调用自己的Handler。所幸的是目前几乎所有的AOP Framework都对这方面提供了很好的支持.这里推荐大家使用Spring(http://www.springframework.org/ ).
发表评论
-
Java中用动态代理类实现记忆功能
2009-07-22 14:30 703记忆是衍生自lisp,python, ... -
JAVA动态代理实现方法
2009-07-22 14:31 696在目前的Java开发包中包含了对动态代理的支持,但是其实现只支 ... -
对代理模式与Java动态代理类的理解(转)
2009-07-22 14:32 7671. 代理模式 代理模式的作用是:为其他对象 ... -
十年与java 相关的名字
2009-07-22 17:12 732RickardOberg:J2EE奇才 文/ ... -
搞懂java中的synchronized关键字
2009-07-28 17:48 607实际上,我关于java的基 ... -
字符串转化为unicode编码
2009-07-31 16:16 902package com.util; import java. ... -
移位运算符的规则及其数学意义
2009-07-31 18:02 780移位运算符就是在二进制的基础上对数字进行平移。按照平移的方 ... -
几个谜题,深入的了解java
2009-08-03 17:02 732在2009年的JavaOne大会上,Joshua Bloch和 ... -
一、我对java中编码的理解(摘)
2009-08-06 09:17 6251. 编码的产生 对电 ... -
四、深入下package,import:(摘)
2009-08-06 09:18 708注:因package,import涉及较多内容,另开一个帖子了 ... -
三、我对java中类路径的理解(摘)
2009-08-06 09:18 529Java中的类路径分“编译后的存放路径” 和 “运行时的查找路 ... -
二、我对java中类装载的理解(摘)
2009-08-06 09:18 7771.Java中的所有类,必须 ... -
java class文件格式解析(摘)
2009-08-06 09:19 7931.目的 ... -
关于 JavaBean 规范你还是应该知道的二三事
2009-08-06 09:22 824作为 Java 程序员,对于 JavaBean 也许你会说再熟 ... -
synchronized(this)的几个简单示例
2009-08-06 10:31 823一、当两个并发线程访问同一个对象object中的这个synch ... -
java压缩对象 与 对象的序列化
2009-08-07 17:39 668gzip是目前广泛应用的一种压缩方式,它具有很高的压缩比和压缩 ... -
Java常见问题集锦
2009-08-12 12:22 681如何设置Java 2(JDK1.2)的环境变量? 哪些Jav ... -
JavaFX尝鲜
2009-08-17 17:24 506java6出来以后,其一大 ... -
Java在不同环境下获取当前路径的方法--this.getClass().getResource("")
2009-08-17 17:24 7071. 在Servlet/Filter等Servlet web环 ... -
JAVA进阶:VO(DTO)与PO(DAO)之间的转换
2009-08-26 13:58 900PO即 Persistence Object VO ...
相关推荐
Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...
值得注意的是,虽然这个例子展示了如何手动使用Java动态代理实现AOP,但在实际项目中,通常会使用像Spring这样的框架,它们提供了更高级的AOP功能,包括切点表达式、通知类型、织入策略等,使得AOP的使用更加便捷和...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...
以下是一个简单的例子,展示了如何使用Java动态代理实现AOP: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface MyInterface {...
现在,我们使用Java动态代理来实现AOP。首先,我们需要创建一个`InvocationHandler`实现类,用于处理业务方法的调用,并插入额外的行为(例如日志记录): ```java public class LoggingInvocationHandler ...
本项目旨在通过Java的动态代理技术实现面向切面编程(AOP),涵盖了静态代理、JDK动态代理、CGLIB动态代理、AspectJ以及基于instrumentation的动态代理等多种实现方式。通过这些实现方式,可以在不修改原有代码的...
总之,Java动态代理和AOP提供了强大的工具,使我们能够优雅地实现代码解耦,提高代码的复用性和可维护性。通过代理对象,我们可以在不修改原始类代码的情况下,添加额外的功能或改变原有行为,这对于系统的服务层和...
这些代码可能涉及到如何创建分页对象,如何与数据库交互获取分页数据,以及如何在AOP中使用动态代理进行拦截和处理。 总的来说,Java分页、动态代理和AOP是Java开发中的关键技术,它们能帮助我们构建出更加高效、可...
因此,在实际开发中,需要根据应用场景的性能要求和维护需求,权衡是否使用动态代理。 总之,AOP通过提供一种新的角度来解决OO编程中存在的问题,使得我们能够在保持业务逻辑清晰的同时,增加额外的通用功能。利用...
下面是一个简单的Java动态代理实现AOP的例子,模拟日志记录功能: ```java public interface MyInterface { void doSomething(); } public class MyTarget implements MyInterface { @Override public void ...