zoukankan      html  css  js  c++  java
  • Spring学习(五)--Spring的IOC

    1、BeanDefinition在IOC的注册

    当BeanDefinition完成载入和解析之后,用户定义的BeanDefinition在IOC容器中已经建立自己的数据结构和数据表示,但是无法使用,需要进行注册,注册就是把解析得到的BeanDefinition放置到HashMap中。

    通过在BeanLisabletDefinition中实现BeanDefinitionRegisitry接口,来完成注册。

    注册调用过程:

    2、IOC容器的依赖注入

    依赖注入是用户第一次在IOC容器中查找Bean时发生的,通过BeanFactory接口的getBean()方法触发依赖注入。

    依赖注入的过程:getBean()->creatBean()->instantiate()

    生成Bean对象:(1)通过BeanUtils,JVN反射

           (2)通过CGLIB,SimpleInstantatiationStrategy()方法

    依赖注入是发生在BeanWrapper的setProperty Values中实现的,具体的完成在BeanWrapper子类BeanWrapperImpl中。

    在Bean的创建和对象依赖注入的过程中,需要依据BeaDefinition中的信息来递归的完成依赖注入。这些地柜都是以getBean()为入口的,一个递归是在上下文体系中查找需要的Bean和创建Bean的递归调用,另一个递归是在依赖注入时,通过递归调用GetBean()方法,得到当前Bean所依赖的Bean,同时触发对依赖Bean的创建和注入。

    3、ApplicationContext和Bean的初始化和销毁

    ApplicationContext启动是在AbstractApplicationContext中实现的。

    使用上下文需要做一些准备工作,这些准备工作是在prepareBeanFactory()中实现的,这些方法中为容器配置了ClassLoader、PropteryEditor、BeanPostProcessor等。

    容器的初始化和关闭过程:

    容器关闭是在doClose()方法中完成的。

    先发出容器关闭信号,再逐条关闭Bean,最后关闭容器。

    Bean在IOC中的生命周期:

    (1)Bean实例的创建。

    (2)为Bean实例设置属性。

    (3)调用Bean的初始化方法。

    在initializeBean()方法中实现,调用初始化方法之前会调用一系列aware接口,把相关的的BeanClassLoader、BeanName、BeanFactory注入到Bean中去。

    (4)应用通过IOC容器使用Bean。

    (5)容器关闭时,销毁Bean。

    3、lazy-init属性和预实例化

    在finishBeanFeactoryInitialization的方法中封装了对lazy-init属性操作的方法,实际的处理是在DefultListableBeanFactory这个基本容器的preInstantiateSingletons方法中完成的。

    4、BeanPostProcessor

    BeanPostProcessor是Bean的后置处理器,是一个监听器,它可以监听容器触发的事件,实现BeanPostProcessor接口,然后设置到XML的Bean配置文件中。

  • 相关阅读:
    Leetcode: Find Median from Data Stream
    Leetcode: Flip Game II
    Leetcode: Flip Game
    Leetcode: Nim Game
    Leetcode: Word Pattern II
    Leetcode: Word Pattern
    Leetcode: Game of Life
    Leetcode: Alien Dictionary && Summary: Topological Sort
    Leetcode: Unique Word Abbreviation
    Leetcode: Find the Duplicate Number
  • 原文地址:https://www.cnblogs.com/carblack/p/10872116.html
Copyright © 2011-2022 走看看