zoukankan      html  css  js  c++  java
  • spring-aop总结 spring创建bean时合适进行代理增强

    以下是自己的理解,如不对请不吝赐教谢谢,勿喷

    普通的bean创建

      跟下面的创建过程一样,如某个bean被aop增强了,在实例化完之后会调用AbstractAutoProxyCreator.postProcessAfterInitialization方法,这个方法就会返回被增强后的a的代理对象 然后放入一级缓存

    针对循环依赖来说

    a->b

    b->a

    调用docreateBean方法创建bean a实例完之后,会把未注入和初始化的bean放入三级缓存中也就是singletonFactorys中,接下来会进行依赖注入 这时发生循环依赖的话

    会去创建b对象,b对象实例化之后 进行依赖注入发现依赖a,这时去三级缓存中找到了a被包装成objecFactory的早期实例,就去调用a的objectFactory的getObject方法, 如果

    a被aop增强了就把增强后的a对象从三级缓存删除放入二级缓存,这时b应该持有a被增强后的代理对象,spring是怎么处理的呢?

    如果a被aop增强了,那么就是AbstractAutoProxyCreator的子类,就会调用后处理器的postProcessAfterInitialization方法,这个方法就会返回被增强后的a的代理对象.然后b继续依赖注入

    初始化完放入一级缓存a继续进行注入....

    <aop:aspectj-autoproxy>

    这个标签,会放入容器中一个AnnotationAwareAspectJAutoProxyCreator类型的后处理器,当所有的bean被创建的时候,实例化完会执行这个后处理的 postProcessAfterInitialization 方法,

    这个方法会解析所有@aspect注解修饰的类获取到对应的advisor增强 里面包含着切点表达式pointcut 还有增强逻辑就是method和类本身 方便后续进行增强的时候反射调用

    并匹配到符合切点的bean进行增强 然后放入容器是以便后续使用

  • 相关阅读:
    [转]在Windows 7 X64系统中安装SharePoint 2010
    使用CUBE和ROLLUP对数据进行汇总
    SQL Server、Oracle数据库排序空值null问题解决办法
    解释传统与敏捷方法最贴切的故事:大象与猴子
    3个简单的问题教会你如何做人、做事、做学问
    DOS命令行方式使用FTP实战练习
    SQL四种语言:DDL,DML,DCL,TCL
    如何对软件需求进行测试
    Windows中的句柄(handle)
    软件静默安装参数
  • 原文地址:https://www.cnblogs.com/isnotnull/p/14443919.html
Copyright © 2011-2022 走看看