Spring揭秘-二刷读书笔记_2020.03.17

Spring揭秘

  1. Bean 装配的整体流程(BeanFactory)

    1. 容器启动

      1. 加载配置文件

      2. 配置文件(如:xml)转换成BeanDefinition

        1. 转换过程中Spring提供了BeanFactoryPostProcessor的扩展点,可以通过该扩展点修改BeanDefinition。比如PropertyPlaceHolderConfigurer可以把xml中使用的占位符替换成实际的值

        2. CustomEditorConfig.不修改BeanDefinition的值,只是单纯的注入数据,以供后续getBean的时候使用,常用来把String的配置转换成各种对象。比如StringArrayPropertyEditor把逗号分割的字符串转为字符串数组

    2. Bean实例化

      1. 实例化对象

        1. 实例化对象通过BeanWrapper包裹
      2. 设置对象属性,如果对象实现了XXXAware接口,就注入相应的对象,比如ApplicationContextAware

      3. BeanPostProcessor.postProcessBeforeInitialization的前置处理

        1. Aware的注入就是通过这种方式实现的
      4. afterPropertiesSet方法跟init-method方法执行

      5. BeanPostProcessor.postProcessAfterInitialization的后置处理

      6. ...

    3. FactoryBean

      1. bean在xml中的配置可以采用工厂方法来注入一个对象,当你不想使用xml做复杂配置的时候,可以实现FactoryBean,并将其配置到xml中,这样获取对象的时候对调用FactoryBean的getObject方法获取对象,所以FactoryBean本身是一个等价于工厂的Bean
  2. Application

    1. 统一资源加载的秘密

      1. Spring自己抽象了Resource,ResourceLoader

      2. ApplicationContext继承了 ResourceLoader

    2. i18n

  3. AOP

    1. 组成

      1. JoinPoint : 切入点,如xxx类的xxx方法

      2. PointCut:切入点的描述(方法名,正则表达)

      3. Advice:横切逻辑的载体

        1. Before Advice

        2. After Advice

        3. Around Advice

      4. Aspect:切面实体,封装PointCut,Advice

      5. 逻辑织入器:

        1. Spring AOP -> ProxyFactory
    2. 横切时机

      1. 编译器

      2. 运行期

        1. 动态代理

        2. 字节码生成

  4. Spring-AOP

    1. JoinPoint:方法

    2. PointCut:描述JoinPoint,可以通过类名,方法名过滤,通过方法名过滤的时候还可以区分是否关注方法参数,可以实现方法名+参数值级别的过略

    3. Advice

      1. per-class:Advice实例可以在对象的所有实例上共享,Before/After/Throwing/Returning Advice

      2. per-instance:为每个实例生产各自的的逻辑,IntroductionInterceptor

    4. Aspect:

      1. 组装

      2. 顺序越小优先级越高

    5. 织入器:

      1. ProxyFactory

      2. IOC+AOP

        1. ProxyFactoryBean继承FactoryBean,ProxyFactory的公用父类

        2. 在getObject中调用生成代理的方法即可