`
michael.softtech
  • 浏览: 208423 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    spring 中特殊bean用法

    9. **Bean后处理器(Bean Post Processor)**: Bean后处理器允许在初始化Bean之后和销毁Bean之前执行自定义逻辑。通过实现`BeanPostProcessor`接口,我们可以自定义Bean的初始化和销毁行为。 10. **Resource注入**:...

    postprocessor-builder-sample:后处理器构建器示例

    后处理器(PostProcessor)是一种接口,它扩展了Spring框架的功能,提供了在实例化、初始化和装配bean之后,但在bean可以被应用程序使用之前对其进行处理的机会。这些处理器可以用来添加额外的行为,例如实现AOP...

    spring-beans

    5. **Bean后处理器(Bean Post Processor, BPP)** Bean后处理器是在Bean实例化之后、初始化之前,以及销毁之前、之后进行处理的接口。例如,我们可以使用它来实现AOP(面向切面编程)的增强。 6. **元数据支持** ...

    仿spring ioc 容器

    5. **AOP支持**:虽然这不是IoC容器的基本功能,但Spring的另一个亮点是面向切面编程(AOP),可以在仿制品中考虑添加简单版的AOP支持,如后置处理器(PostProcessor)。 6. **扩展性**:一个好的IoC容器应该易于...

    实验一:Spring IoC中Bean的装置的jar包

    此外,Bean后处理器(Bean Post Processor)允许我们在Bean初始化前后进行自定义处理,进一步增强灵活性。 在实际项目中,我们通常会将这些配置打包成jar文件,以便于其他模块或应用引用。这样,我们可以通过Spring...

    spring_core

    **Bean后处理器(Bean Post Processor)**:Bean后处理器允许在Bean初始化前后执行自定义逻辑。这可以用于自定义属性设置、AOP代理创建等。 **事件机制**:Spring提供了ApplicationContextEvent和Application...

    mySpringImpl:我的spring学习-实现原理

    "mySpringImpl"可能会包含一些自定义的后处理器(PostProcessor)、事件监听器(EventListener)等,这些都是Spring提供给开发者进行定制化开发的接口。 通过"mySpringImpl"的学习,你可以深入了解Spring框架的工作...

    beanAssemble.rar

    `bg05:Bean后处理器`(Bean Post Processor)是Spring提供的一种扩展机制,它允许我们在Bean实例化后和初始化前后执行自定义逻辑。例如,我们可以使用后处理器进行AOP代理、属性值后处理等操作。实现`...

    spring-xml:春天的XML

    8. **bean的生命周期**:XML配置还可以控制bean的初始化和销毁方法,以及bean的后处理器等,通过`init-method`、`destroy-method`和`&lt;bean post-processor&gt;`标签实现。 9. **AOP配置**:虽然在XML配置中进行AOP配置...

    对字典表的数值转换为字符串

    3. **后处理器(AspectJ Post-Processor)**:在Spring AOP中,后处理器是处理注解的一种方式。`DictLabelAspect`可能会实现`BeanPostProcessor`接口,以便在对象初始化后处理其属性,或者实现`AspectJAroundAdvice`...

    Java Annotation手册

    Spring框架中的注解支持AOP,如@Transactional,用于声明式事务管理。 六、实际应用案例 6.1 Spring框架 Spring的@Component、@Service、@Repository 和 @Controller 等注解用于组件扫描,实现依赖注入。 6.2 JPA...

Global site tag (gtag.js) - Google Analytics