ProxyFactoryBean的构成

  • target

目标对象,需要对其进行切面增强

  • proxyInterfaces

代理对象所实现的接口

  • interceptorNames

通知器列表,包含了通知和切点

ProxyFactoryBean的作用

针对目标对象来创建代理对象,将对目标对象方法的调用转到对相应代理对象方法的调用,并且可以在代理对象方法调用前后执行与之匹配的各个通知器中定义好的方法。

目标对象的创建方式

spring提供了三种创建目标对象的方式,包括:

  • Java动态代理(JdkDynamicAopProxy.java)

基于JDK的动态代理实现,JDK动态代理可以基于接口去创建一个代理对象,无法基于类去创建一个代理对象。

  1. @Override
  2. public Object getProxy(@Nullable ClassLoader classLoader) {
  3. if (logger.isTraceEnabled()) {
  4. logger.trace("Creating JDK dynamic proxy: " + this.advised.getTargetSource());
  5. }
  6. Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
  7. findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
  8. return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
  9. }
  • CGLIB(CglibAopProxy.java)

核心功能是为目标类生成子类,用子类代替父类;

  • ObjenesisCglibAopProxy

基于Cglib实现。从spring 4.0开始,引入了这种方式。
image.png