为什么需要动态代理
-
对于代码的增强逻辑我们是清楚具体实现的,一种方式是增强逻辑作为委托类,被其他业务类调用,
这样会有很多重复代码,而且,当需要根据动态参数来决定增强逻辑时,重复代码会更多,逻辑会更不清晰 -
二,也是动态代理产生的原始需求,解决类爆照问题, 所以jvm自动加载动态生成的class字节码,形成动态代理对象
-
三 动态代理核心要解决就去取增强其他业务代码, 业务代码是泛化的,不确定的,
但是增强逻辑是确定,所以对于泛化的业务代码统一抽象为method对象, 由invacationHandler吞入该method参数, 这样通过method.invoke(业务对象,业务参数)调用了业务方法也调用了增强逻辑,所以 业务代码和增强逻辑的混合是在invocationHandler这个接口对应的实现类实现的, jvm的一个Proxy实际代表了一个对InvocationHandler的包装
动态代理和spi的区别
-
动态代理核心要解决的问题是 业务方法的泛化增强, 也即 业务方法是哪个不是很清楚具体的哪一个,连方法名和参数个数 都不知道, 但是增强逻辑是很明确的;
- spi是业务方法的定义是明确的, 但是具体这个方法该如何实现逻辑有不同的实现方式,类似与多态,