zoukankan      html  css  js  c++  java
  • Bean的前身今世&处理器&Aware

    出生: <bean>......</bean>

    幼年:BeanDefinition  bean的接口定义

    小学:GenericBeanDefinition  基础的bean映射

    中学:RootBeanDefinition  拥有依赖关系等附加信息等bean

    大学:BeanWrapper  内部用

    社会:Object 你的bean

    BeanDefinition

    BeanDefinition是一个接口,在Spring中存在三种实现:RootBeanDefinition、ChildBeanDefinition以及GenericBeanDefinition。三种实现均继承了AbstractBeanDefinition,其中BeanDefinition是配置文件元素标签在容器中的内部表示形式。元素标签拥有class、scope、lazy-init等配置属性,BeanDefinition则提供了相应的beanClass、scope、lazyInit属性,BeanDefinition和中的属性是一一对应的。其中RootBeanDefinition是最常用的实现类,它对应一般性的元素标签,GenericBeanDefinition是自2.5版本以后新加入的bean文件配置属性定义类,是一站式服务类。

    在配置文件中可以定义父和子,父用RootBeanDefinition表示子用ChildBeanDefiniton表示而没有父的就使用RootBeanDefinition表示。AbstractBeanDefinition对两者共同的类信息进行抽象。

    Spring通过BeanDefinition将配置文件中的配置信息转换为容器的内部表示,并将这些BeanDefiniton注册到BeanDefinitonRegistry中。Spring容器的BeanDefinitionRegistry就像是Spring配置信息的内存数据库,主要是以map的形式保存,后续操作直接从BeanDefinitionRegistry中读取配置信息。

     

    Bean的生命周期 

    IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。(默认是BeanFactory的生命周期)

    标红的二选一

    Bean的建立

      由BeanFactory读取Bean定义文件,并生成各个BeanDefinition。

    BeanFactoryPostProcessor的postProcessBeanFactory

      容器每一次刷新时(初始化)调用,它是对BeanDefinition进行后处理,具体的作用就是可以修改配置文件的各个bean的配置。

    InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation

      所有bean对象实例化之前执行,具体点就是执行每个bean类构造函数之前。 Give BeanPostProcessors a chance to return a proxy instead of the target bean instance。返回一个Object,实际上返回一个null即可。如果不为null就不再执行下面bean的实例化,直接返回此时的object。

    Bean实例化,调用bean类构造函数

    InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation

      bean类实例化之后,初始化之前调用。返回类型是boolean,默认是false,你需要更改为true,否则无法注入属性

    InstantiationAwareBeanPostProcessor的postProcessPropertyValue

      属性注入之前调用。返回类型是PropertyValue,默认返回null,这里需改为返回第一个参数。

    Setter注入

      执行Bean的属性依赖注入。
    BeanNameAware的setBeanName()

      属性注入后调用,该方法作用是让bean类知道自己所在的Bean的name或id属性。 

    BeanFactoryAware的setBeanFactory()

      setBeanName后调用,该方法作用是让bean类知道自己所在的BeanFactory的属性(传入bean所在BeanFactory类型参数)。 

    BeanPostProcessor的postProcessBeforeInitialization()

      对bean实例化、初始化做些预处理操作。返回类型为Object,默认返回null,需要返回参数中bean。

    InstantiationAwareBeanPostProcessor(本身继承了BeanPostProcessors)的postProcessBeforeInitialization

      再次执行,参考上面的描述

    InitializingBean的afterPropertiesSet()

      bean类实现InitializingBean接口,重写该方法。初始化工作,但实现该接口这种方法和Spring耦合,不推荐(这一点DisposableBean一样)。

    Bean定义文件中定义init-method

      执行initMethod()方法,注意,这个方法是不带参数的。

    BeanPostProcessor的postProcessAfterInitialization()

      Bean在初始化之后做些修改。返回类型为Object,默认返回null,需要返回参数中bean。

    InstantiationAwareBeanPostProcessor的postProcessAfterInitialization

      再次执行,参考上面的描述  

    程序执行,bean工作

    DisposableBean的destroy()

      bean销毁前执行。

    Bean定义文件中定义destroy-method

      执行destroyMethod()方法,注意,这个方法是不带参数的。

     

    Spring的aware

    spring框架提供了多个*Aware接口,用于辅助Spring Bean编程访问Spring容器。

    通过实现这些接口,可以增强Spring Bean的功能,但是也会造成对Spring框架的绑定。
    ApplicationContextAware,ApplicationContext
    LoadTimeWeaverAware,加载Spring Bean时织入第三方模块,如AspectJ
    BeanClassLoaderAware,加载Spring Bean的类加载器
    BootstrapContextAware,资源适配器BootstrapContext,如JCA,CCI
    ResourceLoaderAware,底层访问资源的加载器
    BeanFactoryAware,声明BeanFactory
    PortletConfigAware,PortletConfig
    PortletContextAware,PortletContext
    ServletConfigAware,ServletConfig
    ServletContextAware,ServletContext
    MessageSourceAware,国际化
    ApplicationEventPublisherAware,应用事件
    NotificationPublisherAware,JMX通知
    BeanNameAware,声明Spring Bean的名字

     

      

     

  • 相关阅读:
    java中怎么解决路径中文的问题
    Json
    ajax
    MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法
    关于web.xml的格式
    关于RuntimException
    JNDI
    Dreamweaver使用过程的小技巧
    web-service客户端与服务器端的连接
    Python3
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/6067061.html
Copyright © 2011-2022 走看看