最近在研究这个java的ssh三大框架,当看到这个spring的aop(aspect-orinted-programming)的时候,其中提到了这个java的动态代理机制,这个动态代理,我以前似乎看过,但是那是设计模式的事情。所以有一次搜索到这个动态代理,对这个动态代理进行一个研究,记录自己的进步。
spring的aop编程是一个面向切面的编程思想,和这个面向对象的编程是一个补充的关系,不是一个对立的关系。面向对象强调和使用的从上到下的层次关系,但是aop编程使用的是从左到右的关系。一个是纵的关系(面向对象),一个是横的关系(面向切面)。既然提出了这个切面的编程思想,那么一定是一个问题促使了这个思想的提出。我了解的只有这个spring的aop,所以我们值讨论这个spring的方面的额东西。首先是这个spring是一个web的一个应用框架,所以这个web有的时候要对这个信息进行一定的日志记录,比如说你登录、购物、修改密码、申请、填写信息等等,这个有的石油是需要日志记录的,所以,你要在每一个类里面加载一个日志记录的功能。
但是这个日志的记录功能似乎和这个spring的业务逻辑的联系似乎不是很大,这个应该属于边缘逻辑业务吧。而且,你的很多代码都是重复的,这个时候,你如果使用这个静态的代理模式,这个重复的代码量更加是惊人的,所以,有高人提出了这个动态的代理模式。聪明人就是聪明人,解决问题永远这么厉害。
这个java的的动态代理使用java的reflect模式。
使用这个java.lang.reflect.InvocationHandler这个接口,继承这个接口之后,使用这个接口的invoke方法,你在这个方法之中可以调用你传递过来的接口的方法,这样子你就可以在你的要代理的目标的上进行一个修饰操作了。我猜测这个java的源代码一定是会自动的调用这个接口的invoke方法的。