Spring揭秘
- 
- 容器启动 - 加载配置文件 
- 配置文件(如:xml)转换成BeanDefinition - 转换过程中Spring提供了BeanFactoryPostProcessor的扩展点,可以通过该扩展点修改BeanDefinition。比如PropertyPlaceHolderConfigurer可以把xml中使用的占位符替换成实际的值 
- CustomEditorConfig.不修改BeanDefinition的值,只是单纯的注入数据,以供后续getBean的时候使用,常用来把String的配置转换成各种对象。比如StringArrayPropertyEditor把逗号分割的字符串转为字符串数组 
 
 
- Bean实例化 - 实例化对象 - 实例化对象通过BeanWrapper包裹
 
- 设置对象属性,如果对象实现了XXXAware接口,就注入相应的对象,比如ApplicationContextAware 
- BeanPostProcessor.postProcessBeforeInitialization的前置处理 - Aware的注入就是通过这种方式实现的
 
- afterPropertiesSet方法跟init-method方法执行 
- BeanPostProcessor.postProcessAfterInitialization的后置处理 
- ... 
 
- FactoryBean - bean在xml中的配置可以采用工厂方法来注入一个对象,当你不想使用xml做复杂配置的时候,可以实现FactoryBean,并将其配置到xml中,这样获取对象的时候对调用FactoryBean的getObject方法获取对象,所以FactoryBean本身是一个等价于工厂的Bean
 
 
- Application - 统一资源加载的秘密 - Spring自己抽象了Resource,ResourceLoader 
- ApplicationContext继承了 ResourceLoader 
 
- i18n 
 
- AOP - 组成 - JoinPoint : 切入点,如xxx类的xxx方法 
- PointCut:切入点的描述(方法名,正则表达) 
- Advice:横切逻辑的载体 - Before Advice 
- After Advice 
- Around Advice 
 
- Aspect:切面实体,封装PointCut,Advice 
- 逻辑织入器: - Spring AOP -> ProxyFactory
 
 
- 横切时机 - 编译器 
- 运行期 - 动态代理 
- 字节码生成 
 
 
 
- Spring-AOP - JoinPoint:方法 
- PointCut:描述JoinPoint,可以通过类名,方法名过滤,通过方法名过滤的时候还可以区分是否关注方法参数,可以实现方法名+参数值级别的过略 
- Advice - per-class:Advice实例可以在对象的所有实例上共享,Before/After/Throwing/Returning Advice 
- per-instance:为每个实例生产各自的的逻辑,IntroductionInterceptor 
 
- Aspect: - 组装 
- 顺序越小优先级越高 
 
- 织入器: - ProxyFactory 
- IOC+AOP - ProxyFactoryBean继承FactoryBean,ProxyFactory的公用父类 
- 在getObject中调用生成代理的方法即可