美文网首页
Spring学习(三) Spring容器实现原理浅析

Spring学习(三) Spring容器实现原理浅析

作者: jjjjxd | 来源:发表于2018-05-29 19:26 被阅读0次

    第二章写的是spring xml一些标签及使用,标签较多整理起来较慢~就先写三了【自己对一些标签也不是很了解,真的需在查】
    一、Spring启动时可以分为两个阶段:容器启动阶段、Bean实例化阶段。(每个阶段加入了扩展点,方便我们进行自定义扩展)
    1、容器启动阶段
    容器启动时,采用某种途径加载Configuration MetaData(Bean 元数据) ,在大部分情况下,容器采用工具类(BeanDefinitionReader)对加载Configuration MetaData的Cofiguration MetaData进行解析,解析后构造BeanDefinition,最后将保存的Bean注册到BeanDefinitionRegistry中。这样容器启动就完成了
    2、Bean实例化阶段
    在第一阶段中,所有Bean都以BeanDefinition存储在BeanDefinitionRegisty中,当 某个请求通过容器getBean()明确的请求某个Bean或者因依赖关系隐式的请求某个Bean时,容器会检查所请求的对象是否被初始化,如果没有则会进行初始化对象。

    Bean实例化过程.png

    二、插手容器启动
    1、插手容器启动阶段
    Spring提供了BeanFactoryPostProcessor容器扩展机制,该机制允许我们在对象实例化之前修改BeanDefinition进行修改,比如为Bean定义某些属性,为Bean增加信息
    因为一个容器可能有多个BeanFactoryProcessor,因此还需实现Spring.Core.Ordered接口,保证顺序。这样比较不方便,因此我们一般使用Spring提供的现成BeanFactoryPostProcessor:PropertyPlaceholderConfigurer和PropertyOverrideConfigurer
    ①PropertyPlaceholderConfigurerPropertyPlaceholderConfigurer:
    我们经常将可变配置写在properties中,并在xml使用{xxxx.xxxxxx}占位符进行代替,当BeanFactory加载完所有信息时,BeanFactory中保存的BeanDefinition信息还是以占位符的方式存在,然后执行BeanFactoryPostProcessor,当执行到PropertyPlaceholderConfigurer时就会将配置文件中的数据替代占位符。PropertyOverrideConfigurer和PropertyOverrideConfigurer功能类似,不过它会把PropertyOverrideConfigurer中的配置覆盖
    2、插手Bean实例化阶段
    ① Bean实例化时,采用策略模式来决定何种方式来初始化Bean实例,可以通过反射或者Cglib动态字节码初始化Bean实例,初始化完成后返回一个BeanWrapper。
    ②检查Aware接口,设置依赖,如BeanNameAware、ApplicationContextAware(针对ApplicationContxt容器)
    ③BeanPostProcessor(与BeanFactoryPostProcessor类似),前置处理【通常作为处理接口的实现类,或为当前代理提供代理实现】
    ④检查是否实现InitializingBean或指定init-method,如果是 则调用afterPropertiesSet或指定的Init-method来继续调整对象状态
    ⑤BeanPostProcessor 后置处理
    ⑥使用
    ⑦检查是否是实现DisposableBean或指定destory-method【一般数据库配置都会指定destory-method】;

    相关文章

      网友评论

          本文标题:Spring学习(三) Spring容器实现原理浅析

          本文链接:https://www.haomeiwen.com/subject/wpbdjftx.html