ApplicationContext过程
1.准备刷新的上下文环境。
2.初始化BeanFactory,并进行XML文件读取:
1)创建DefaultListableBeanFactory。
2)指定序列化id。
3)定制beanFactory,设置相关属性。
4)初始化documentReader,并进行XML文件读取与解析:
1_为指定的beanFactory创建XmlBeanDefinitionReader。
2_对xmlBeanDefinitionReader进行环境变量的设置。
3_使用XmlBeanDefinitionReader的LoadBeanDefinition方法进行配置文件的解析加载及注册。
5)使用全局变量记录BeanFactory类实例。
3.对BeanFactory进行各种功能填充:
1)增加对SpEL语言的支持。
2)增加对属性编辑器的支持。
3)添加BeanPostProcessor (ApplicationContextAwareProcessor)。
4)设置依赖功能可忽略的接口。
5)注册一些固定依赖的属性。
6)增加对AspectJ的支持。
7)将相关环境变量及属性注册以单例模式注册。
4.postProcessBeanFactory(beanFactory): ——此方法是预留给子类重写,以实现额外的处理。
5.激活各种BeanFactory处理器。
6.注册拦截Bean创建的BeanPostProcessor:
——BeanFactory中没有实现后处理器的自动注册,调用的时候需要手动注册。而现在ApplicationContext实现了自动注册的功能。
——这里只是注册,没有调用。
7.初始化MessageSource,国际化处理。
8.初始化应用消息广播器。
。。。
Bean加载的过程
getBean()。
1.转换对应的beanName:
去除修饰符,如FactoryBean,&aa 变为 aa。如果bean是一个FactoryBean,则
如果使用的是别名,则返回其最终的beanName
2-1先从缓存中加载单例:
——因为在创建单例bean的时候,如果有依赖的话,可能会出现循环依赖的问题。为了避免这个问题,在创建bean的时候不等创建完成就会将创建的bean的ObjectFactory放到缓存中。
1)首先尝试从singletonObjects里面获取实例,里面维护了beanName和bean实例的关系。
2)如果没获取到,从earlySingletonObjects里面获取。
3)还获取不到,则尝试从singletonFactories里取,里面维护了beanName与创建bean的工厂之间的关系,然后将拿到的ObjectFactory放到earlySingletonObjects里面去,并将singletonObjects中的ObjectFactory去除掉。
2-2如果没有从缓存中拿到:
。。。
创建bean:——返回的是ObjectFactory对象
根据设置的class属性或者根据className来解析Class。
对override属性进行标记及验证。
应用初始化前的后处理器:
——调用postProcessBeforeInstantiation()方法,bean可能已经是一个代理生成的bean了。
——调用postProcessAfterInitialization()方法,因为Spring会尽力保证所有bean初始化后都会调用这个后处理器的方法。
创建bean,如果上面返回的bean不是null,则不会走这一步:
1_如果是单例需要首先清除缓存
2_实例化bean,将BeanDefinition转换为BeanWrapper
3_应用MergedBeanDefinitionPostProcessor。
4_防止循环依赖,在bean初始化完成前将创建实例的ObjectFactory加入工厂。
5_属性填充。
6_初始化。
在调用初始化方法前后会调用后处理的方法。
如果该bean是InitializingBean,则需要调用afterPropertiesSet()方法。
如果定义了init-method,则会执行该方法。
7_循环依赖检查,抛出异常。
8_注册DisposableBean
9_完成创建并返回。
首先判断singletonObjects缓存里面有没有。如果有,则直接返回了。
没有加载,则将beanName记录为记载状态,放到singletonsCurrentlyInCreation里。
调用ObjectFactory的getObject方法实例化bean。
加载单例后,移除缓存中bean的正在加载状态的记录。
将结果记录至缓存并删除加载bean过程中所记录的各种辅助状态。
3.从bean的实例中获取对象:
1)对FactoryBean正确性验证。
2)对非FactoryBean的不做任何处理。
3)将bean进行转换,转换成FactoryBean的对象。
3)从FactoryBean中解析bean
里面获取bean是调用了getObject方法,返回创建的实例。所以继承自FactoryBean的bean获取实例都是创建实例而不是本身
调用了后处理器,Spring会尽可能保证所有bean初始化后都会调用注册的BeanPostProcessor的postProcessAfterInitialization()方法。
4.原型模式的依赖检查
5.检测parentBeanFactory
6.将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition
7.寻找依赖
8.针对不同的scope进行bean的创建
9.类型转换
Spring AOP
前面讲到Spring尽量为每个bean都实现调用postProcessAfterInitialization()方法,在这个方法中,Aop就在wrapIfNecessary()这个方法中展开。
1.获取增强方法或者增强器
1)获取所有的beanName,所有在beanFactory中注册的bean都会被提取出来。
2)遍历所有beanName,并找出声明AspectJ注解的类,进一步处理。
3)对标记为AspectJ注解的类进行增强器的提取。
1_切点信息的获取,只获取Before.class,Around.class,After.class,AfterReturning.class,AfterThrowing.class,PointCut.class这六种注解,提取表达式信息。
2_根据切点信息生成增强。因为不同注解类型需要增强的位置不同,需要不同的增强器来增强。
4)将提取结果加入缓存。
5)前面完成所有增强器的解析,但对于所有增强器来说不一定都是用于当前bean,还要挑选出适合的增强器:
——通过PointCut注解来寻找
2.根据获取的增强进行代理
1)获取当前类中的属性。
2)添加代理接口。
3)封装Advisor并加入到ProxyFactory中。
4)设置要代理的类。
5)进行获取代理操作。