Java动态代理实现AOP
程序员文章站
2024-02-22 08:54:28
目前整个开发社区对aop(aspect oriented programing)推崇备至,也涌现出大量支持aop的优秀framework,--spring, jac, jb...
目前整个开发社区对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 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中。