JAVA中动态代理AOP的实现与思考

来源:互联网 发布:贴图用什么软件 编辑:程序博客网 时间:2024/05/21 05:06
 

 在做开发的时候,总是有一些功能与实际的业务并不相关,但是还要渗透到自己的业务代码里。比如日志打印功能,认证功能,消息发送功能.由于这些公用的代码要在自己的业务代码里完成一定的辅助功能,造成了自己的业务代码里渗透了不相关的业务代码。

所以就产生了代理模式来完成这些功能,使用代理模式可以只关心自己的业务逻辑代码,而那些通用的日志打印功能,权限功能可以使用代理类来实现。比如我要发送一个订单邮件功能,为此要做一个订单邮件的日志代理类,类图结构如图所示:

 

 

 

 

      

    

定义日志接口ILog,订单系统接口IOrderSytem,实现日志和订单系统功能LogImpl,OrderSystemImple,做一个订单系统的代理类OrderSystemProxy,在客户端Client实例化一个OrderSystemProxy,把日志功能与订单功能注入的代理类里。并调用相应的订单方法去生成订单与发送订单确认邮件。

   初看这个设计方案可以使业务功能与辅助功能的代码分离开来.但若系统里面有其他的业务类也要做日志与认证功能,那么就会设计与此业务类相对应的业务代理类。这样代理类就不断的线性增长,导致代理类库庞大。有更好的方法吗?答案是肯定的。

   JDK1.3以后,JAVA就提供一个动态代理的功能,它可以代理任何业务类,然后在调用业务类的任何方法的时候,会调用相应的代理类日志或认证功能,达到了面向切面编程的效果。把上面的静态代理模式改成动态代理模式,类图结构如图所示:

 

     

  

  总结:

    使用动态代理可以完成任何业务类,任何业务方法的代理,但是使用动态代理的前提条件必须要定义业务类的接口,否则动态代理就无法实现。

 

 

   

原创粉丝点击