zoukankan      html  css  js  c++  java
  • spring bean 的生命周期

    SpringBean的生命周期
    1. 进入到刷新的方法refresh();
    2. finishBeanFactoryInitialization()初始化所有单例 对象
    3. preInstantiateSingletons(); 初始化所有的单例对象 注意:非懒加载
    4. getBean() → doGetBean() 先查询该对象是否有初始化过,没有话 就创建注册到IOC容器中
    5. createBean()创建对象 判断对象如果是为单例的情况下调用该方法
    6. doCreateBean()创建IOC对象
    7. createBeanInstance 使用java的反射技术实例化我们的对象
    8. populateBean 给对象set方法属性赋值
    9. invokeAwareMethods 判断bean的类型是否Aware相关依赖,如果存在的情况回调方法。
    10. initializeBean 执行初始化的方法(也可以自己自定义初始化的方法)
    11. applyBeanPostProcessorsBeforeInitialization 在初始化方法之前执行处理 (增强)
    12. invokeInitMethods 调用自定义init方法 (使用java的反射技术)
    13. applyBeanPostProcessorsAfterInitialization 在初始化方法之后执行处理(增强)
    14. 正常是用我们该bean对象
    15. 销毁bean。

    核心的一个接口BeanPostProcessors 目的对我们bean对象自定义初始化方法实现曾强


    如何知道Bean对象到底是如何创建的?
    反射机制

    SpringAop源码分析 需要关联SpringBean的生命周期
    思考:
    1. 什么时候创建代理类对象
    2. SpringAOP中如何 综合运用cglib和Jdk动态

    1. @EnableAspectJAutoProxy 需要开启Aop的权限
    2. @Import(AspectJAutoProxyRegistrar.class)
    3. AspectJAutoProxyRegistrar 手动注册 切面类
    4. AnnotationAwareAspectJAutoProxyCreator 需要将该类注册的IOC容器中
    5. 注册bean信息内容:
    Beanid:org.springframework.aop.config.internalAutoProxyCreator
    class:AnnotationAwareAspectJAutoProxyCreator
    需要了解SpringAOP底层是如何实现的 离不开
    AnnotationAwareAspectJAutoProxyCreator
    得出结论:AnnotationAwareAspectJAutoProxyCreator祖宗是BeanPostProcessors子类。
    6.BeanPostProcessors 是对我们bean的初始化方法实现增强

    Init方法之前和之后处理
    AnnotationAwareAspectJAutoProxyCreator 本质其实就是对init方法实现增强。

    思考几个问题

    AnnotationAwareAspectJAutoProxyCreator 前置和后置到底在做什么事情?
    是在这个类AbstractAutoProxyCreator
    前置:不会处理任何的事情
    后置:postProcessAfterInitialization 使用后置处理实现代理对象一个创建


    也就是任何bean对象在初始化之前都会调用AbstractAutoProxyCreator后置处理判断
    是否需要创建代理类对象

    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    // 有具体前置业务逻辑处理
    }
    // 没有具体业务逻辑的
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
    return bean;
    }

    创建代理对象,如果被代理的这个类如果实现了接口的话,也就使用JDK动态代理,如果没有实现接口则使用cglib。
    注意:只要是一个接口都可以


    疑问:aop中存在很多通知的,每个通知最终如何形成链执行。For循环

  • 相关阅读:
    Vue项目里添加特殊字体或 某些字体乱码的问题
    Vue 事件修饰符
    js 判断是什么浏览器、是否为谷歌浏览器
    Vue 打印预览功能
    Vue v-if与v-show的区别
    js 下载文件/导出
    使用Mysql Workbench 导入数据库提示 ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for
    java 使用注释校验数据有效性
    java poi分批次导入Excel
    浅谈java中源码常见的几个关键字(native,strictfp,transient,volatile)
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/11144526.html
Copyright © 2011-2022 走看看