Spring AOP 与 postprocessor

Spring 中有一个接口非常重要:BeanPostProcessor,这个接口是对bean进行预处理的。

当spring解析bean的时候,在初始化受管bean之前,会调用所有实现了BeanPostProcessor接口的beandefinition的postProcessBeforeXXX方法。

初始化之后,会调用postProcesAfterXXX方法。

 

 下面再来看AOP,都知道aop是通过生成代理类的方式来实现的,那么代理类是在什么时候生成的拿?原来,在

 解析aop namespace配置文件的时候,spring自动生成了一个beandefinition:org.springframework.aop.config.internalAutoProxyCreator。

这个类继承了AbstractAutoProxyCreator,AbstractAutoProxyCreator则是继承了BeanPostProcessor的子类:SmartInstantiationAwareBeanPostProcessor,所以生成bean时,如果bean需要进行代理,则调用如下方法:

 public Object postProcessBeforeInstantiation(Class beanClass, String beanName)
        throws BeansException
    {
        Object cacheKey = getCacheKey(beanClass, beanName);
        if(!targetSourcedBeans.contains(cacheKey))
        {
            if(advisedBeans.contains(cacheKey) || nonAdvisedBeans.contains(cacheKey))
                return null;
            if(isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName))
            {
                nonAdvisedBeans.add(cacheKey);
                return null;
            }
        }
        TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
        if(targetSource != null)
        {
            targetSourcedBeans.add(beanName);
            Object specificInterceptors[] = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
            Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
            proxyTypes.put(cacheKey, proxy.getClass());
            return proxy;
        } else
        {
            return null;
        }
    }

 

  

 protected Object createProxy(Class beanClass, String beanName, Object specificInterceptors[], TargetSource targetSource)
    {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.copyFrom(this);
        if(!shouldProxyTargetClass(beanClass, beanName))
        {
            Class targetInterfaces[] = ClassUtils.getAllInterfacesForClass(beanClass, proxyClassLoader);
            Class aclass[];
            int k = (aclass = targetInterfaces).length;
            for(int i = 0; i < k; i++)
            {
                Class targetInterface = aclass[i];
                proxyFactory.addInterface(targetInterface);
            }

        }
        Advisor advisors[] = buildAdvisors(beanName, specificInterceptors);
        Advisor aadvisor[];
        int l = (aadvisor = advisors).length;
        for(int j = 0; j < l; j++)
        {
            Advisor advisor = aadvisor[j];
            proxyFactory.addAdvisor(advisor);
        }

        proxyFactory.setTargetSource(targetSource);
        customizeProxyFactory(proxyFactory);
        proxyFactory.setFrozen(freezeProxy);
        if(advisorsPreFiltered())
            proxyFactory.setPreFiltered(true);
        return proxyFactory.getProxy(proxyClassLoader);
    }

 

 

 

 至此, aop的内部实现基本分析过了。太细节的东西找时间再看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值