原文出处:http://mp.weixin.qq.com/s/de4XGeTzkAYe4sLo1m0B8g
动态代理:
AOP:
对于添加日志的需求:
可以指定某个包下面的所有的以add开头的方法,在执行前都要调用Logger.startLog(),在执行过后都要调用Logger.endLog()方法。
对于增加事务支持的需求:
所有以DAO结尾的类,所有的方法执行前都要调用TransactionManager.begin(),执行之后都要调用TransactionManager.commit(),如果抛出异常的话调用TransactionManager.rollback()。
但是java帝国不允许修改一个已经被加载或者正在运行的类。
添加一些限制,必须使用接口
但是又无法更改sayHello方法,怎么办?使用一个新类作为HelloWorld的代理去做这些事情,这个新类实现IHelloWorld接口。对于调用者来说,都是实现了IHelloWorld,并无区别。
但是,Logger的代码应该具体加到什么地方?这里需要写一个类来告诉我们具体把Logger的代码加到什么地方,这个类必须实现InvocationHandle 接口,改接口中又一个invoke方法用了写扩展代码的地方。
调用的时候,使用接口引用指向代理类,代理类利用handler来实现动态添加代码的功能。也可以使用其它的接口。
Proxy.newProxyInstance,动态生成了一个类。在运行时,在内存中生成了一个新类,这个类在调用sayHello或者add方法的时候,实际调用的是LoggerHanlder的invoke方法,从而invoke就会拦截真正的方法调用,添加日志功能了