内容来自《Java Web 程序员面试笔试宝典》
【出现频率】★★★★★ 【学习难度】★★★☆☆
答案:AOP(Aspect Oriented Programming),即面向切面编程AOP是通过动态代理来实现的,动态代理指AOP框架不会去修改字节码,而是在内存中临时生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并在特定的切点做了增强处理,回调原对象的方法。
AOP的优点是能够实现通用业务与系统业务的分离,特定业务逻辑与主要业务逻辑的分离,也就是说AOP把一些与具体业务无关,但是被各业务模块共同调用的通用逻辑或特定功能从核心业务中分离出来作为功能编织在一起,减少系统的重复代码,降低了模块间的耦合度,提高了代码的复用性、可移植性,也降低了系统的复杂度,提高了系统的可维护性。Spring 的声明式事务、权限控制、日志管理、缓存、异常处理等都是 AOP 的经典实现。
SpringAOP是基于动态代理实现的,它的动态代理有两种实现方式。
1)JDK动态代理:就是Java代理模式的体现,通过反射机制来实现,在内存中构建出接口的实现类,要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
InvocationHandler接口的核心方法invoke,共有三个参数:第一个参数是生成的代理类实例,第二个参数是目标对象的方法,第三个参数是方法的参数值数组。
ProxyUtil类简单封装了一下Proxy.newProxyInstance( )方法。该方法也有三个参数:第一个参数产生代理对象的类加载器,第二个参数是目标对象的接口数组,第三个参数就是实现InvocationHandler接口的类实例。
那么,为什么JDK动态代理必须基于接口实现呢?
因为动态生成的代理类已经继承了Proxy类(由于Java是单继承),就不能再继承其他的类了,但要生成代理,就需要和被代理的类建立联系,所以只能通过实现被代理类的接口的形式来实现。这也是Java多态性的一种体现。