相信许多java开发人员都是用过动态代理,即使没有直接使用过java.lang.reflect.Proxy或实现过java.lang.reflect.InvocationHandler接口,应该也用过spring来做过Bean的组织管理。如果使用spring,大多数情况下都会用过动态代理,因为如果Bean是面向接口编程那么在Spring内部是通过动态代理的方式来对Bean进行增强的。动态代理中的“动态”,是针对使用java代码实际编写了代理类的“静态”代理而言,它的优势不在于省去了编写代理类那一点工作量,而是实现了可以再原始类和接口还未知的时候,就确定代理类的代理行为,当代理类与原始类脱离直接联系后,就可以很灵活的重用于不同的应用场景之中。
以下我们编写一段代码来演示动态代理的用法,原始逻辑是打印一行“hello word”,代理类的逻辑是在原始类方法执行前打印依据“welcome”。
运行结果如下: