ProxyFactory 源码分析

原创 2018年04月15日 11:35:45

介绍


spring 提供的编程式aop实现,即通过 ProxyFactory类完成的。

举例

@Test
public void testRemoveAdvisorByReference() {
    //被代理的对象
    TestBean target = new TestBean();
    //代理工厂
    ProxyFactory pf = new ProxyFactory(target);
    //拦截器1
    NopInterceptor nop = new NopInterceptor();
    //拦截器2
    CountingBeforeAdvice cba = new CountingBeforeAdvice();
    //增强点
    Advisor advisor = new DefaultPointcutAdvisor(cba);
    pf.addAdvice(nop);
    pf.addAdvisor(advisor);
    //获取代理对象
    ITestBean proxied = (ITestBean) pf.getProxy();
    //方法调用
    proxied.setAge(5);
    assertEquals(1, cba.getCalls());
    assertEquals(1, nop.getCount());
    assertTrue(pf.removeAdvisor(advisor));
    assertEquals(5, proxied.getAge());
    assertEquals(1, cba.getCalls());
    assertEquals(2, nop.getCount());
    assertFalse(pf.removeAdvisor(new DefaultPointcutAdvisor(null)));
}

ProxFactory源码分析


public class ProxyFactory extends ProxyCreatorSupport {
}

getProxy()方法分析

获取代理的对象

public Object getProxy() {
    return createAopProxy().getProxy();
}

createAopProxy()方法实现

protected final synchronized AopProxy createAopProxy() {
    //首次创建代理时进行激活。并调用相应的拦截器
    if (!this.active) {
        activate();
    }
    return getAopProxyFactory().createAopProxy(this);
}
/**创建代理*/
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
    if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
        Class<?> targetClass = config.getTargetClass();
        if (targetClass == null) {
            throw new AopConfigException("TargetSource cannot determine target class: " +
                    "Either an interface or a target is required for proxy creation.");
        }
        //如果被代理的类是一个接口。或者被代理的类的类型是Proxy类
        if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
            //使用jdk代理
            return new JdkDynamicAopProxy(config);
        }
        //否则使用cglib代理
        return new ObjenesisCglibAopProxy(config);
    }
    else {
        return new JdkDynamicAopProxy(config);
    }
}

具体看JdkDynamicAopProxy源码实现:
https://blog.csdn.net/ai_xiangjuan/article/details/79945536

springAOP之ProxyFactory

ProxyFactory就springAOP创建代理的工厂,现在以此为入口进行aop源码的解读。 首先看ProxyFactory的结构图: TargetClassAware根据结构图,先看接口Ta...
  • kuangfengbuyi
  • kuangfengbuyi
  • 2016-09-12 15:04:55
  • 2377

剖析ProxyFactory

Spring 定义了org.springframework.aop.framework.AopProxy接口,并提供了两个final类型实现类...
  • hehexiaoyou
  • hehexiaoyou
  • 2014-04-11 11:10:43
  • 961

Spring中的AOP-ProxyFactory

1. 前置通知 实现org.springframework.aop.MethodBeforeAdvice接口的before方法,该方法接受三个参数:被调用的方法、传给该方法的参数和目标对象。 publ...
  • geloin
  • geloin
  • 2012-05-08 15:20:26
  • 4364

SpringAPI手动创建代理对象——ProxyFactory

可以通过注解的方式来自定义代理对象的创建,同时也可以通过SpringAPI,手动编程的方式来创建代理对象。几个重要的API: ProxyFactory MethodInterceptor...
  • u012834750
  • u012834750
  • 2017-05-12 21:24:42
  • 773

做一个合格的程序猿之浅析Spring AOP源码(十四) 分析ProxyFactoryBean

最基本的实现有三个,AspectJProxyFactory.java ,ProxyFactory.java ProxyFactoryBean这三个,他们的父类ProxyCreatorSupport只是...
  • linuu
  • linuu
  • 2016-03-24 15:20:52
  • 4217

AOP系列(一)——ProxyFactoryObject 显式创建AOP代理

AOP概念   Aspect Oriented Programming,面向切面编程,可以通过预编译方式和运行期动态代理,实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。 前提 了解...
  • u010924834
  • u010924834
  • 2015-08-04 21:15:58
  • 1037

Spring源码学习-5.ProxyFactoryBean实现与源代码分析

1.设计原理 proxyConfig 在这个继承关系中,ProxyConfig是最底层的类,这是一个数据基类,为子类提供配置属性 AdvisedSupport: 封装了AOP对通知和通知器的操作 ...
  • bigcaicai1995
  • bigcaicai1995
  • 2015-08-11 09:08:02
  • 641

SpringAOP(一) ProxyFactoryBean

SpringAOP主要是通过动态代理技术。
  • is_zhoufeng
  • is_zhoufeng
  • 2014-08-07 18:54:47
  • 2484

Spring源码分析之ProxyFactoryBean方式实现Aop功能的分析

实现Aop功能有两种方式, 1. ProxyFactoryBean方式: 这种方式是通过配置实现 2. ProxyFactory方式:这种方式是通过编程实现 这里只说ProxyFactoryBean方...
  • u011734144
  • u011734144
  • 2017-06-18 19:36:40
  • 2062
收藏助手
不良信息举报
您举报文章:ProxyFactory 源码分析
举报原因:
原因补充:

(最多只允许输入30个字)