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中调用生成代理的方法即可