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

 

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

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

 

 

 

 

      

    

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

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

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

 

     

  

  总结:

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

 

 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值