常用的spring bean的扩展接口

常用的Spring Bean扩展接口

  1. InitialingBean和DisposableBean
    Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作,后者在Bean生命周期结束前调用destory()方法做一些收尾工作
  2. BeanNameAware、ApplicationContextAware和BeanFactoryAware
    (1)实现BeanNameAware接口的Bean,在Bean加载的过程中可以获取到该Bean的id
    (2)实现ApplicationContextAware接口的Bean,在Bean加载的过程中可以获取到Spring的ApplicationContext,这个尤其重要,ApplicationContext是Spring应用上下文,从ApplicationContext中可以获取包括任意的Bean在内的大量Spring容器内容和信息
    (3)实现BeanFactoryAware接口的Bean,在Bean加载的过程中可以获取到加载该Bean的BeanFactory
  3. FactoryBean
    开发者可以个性化地定制自己想要实例化出来的Bean,方法就是实现FactoryBean接口
    注册FactoryBean具体实现类时得到的并不是FactoryBean本身,而是FactoryBean的泛型对象,这就是FactoryBean的作用。FactoryBean的几个方法:
    (1)getObject()方法是最重要的,控制Bean的实例化过程
    (2)getObjectType()方法获取接口返回的实例的class
    (3)isSingleton()方法获取该Bean是否为一个单例的Bean
    传入一个String类型的参数,可以动态控制生成出来的是接口的哪种子类。有了FactoryBean,同样可以灵活地操控Bean的生成。
  4. BeanPostProcessor
    InitializingBean、DisposableBean、FactoryBean包括init-method和destory-method,针对的都是某个Bean控制其初始化的操作,而似乎没有一种办法可以针对每个Bean的生成前后做一些逻辑操作,PostProcessor则帮助我们做到了这一点
    BeanPostProcess接口有两个方法,都可以见名知意:
    (1)postProcessBeforeInitialization:在初始化Bean之前
    (2)postProcessAfterInitialization:在初始化Bean之后
    两个方法是有返回值的,返回null会在getBean的时候拿不到对象

Spring装配Bean的过程 (即spring中bean的生命周期)

  1. 实例化bean对象;
  2. 设置属性值;
  3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
  4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
  5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
  6. 调用BeanPostProcessor的预先初始化方法;
  7. 调用InitializingBean的afterPropertiesSet()方法;
  8. 调用定制init-method方法;
  9. 调用BeanPostProcessor的后初始化方法;
  10. bean使用中
  11. 调用DisposableBean的destroy();
  12. 调用定制的destroy-method方法;
    在这里插入图片描述

理解spring中bean实例化和普通自己定义对象的实例化区别?

​ Spring在容器创建一个对象,然后去完成属性的填充,而这种填充在我们外界看来是“自动”的;而我们直接通过new方法创建对象时,是没有谁去完成属性的填充的,因而内部属性值全为null

理解spring中bean的初始化和普通类加载然后初始化的区别?

​ spring中bean的初始化指的是Bean Definition的初始化,所以这两个初始化是不同的两个概念。
​ 普通的Java类如果想被SpringIOC容器托管,拥有强大的扩展功能和更强大的生命周期,用户(程序员)要做的只是写配置或者写注解,然后Spring会做这些事:
​ (1)首先,从xml或者注解扫描后的metadata中读取并加载Java类的原始数据到内存,通常是class二进制文件内容。
​ (2)其次,将上一步读取的内容,转化为BeanDefinition保存到DefaultListableBeanFactory的属性中,内部使用asm的API操作具体的字节码数据内容。
​ (3)最后,需要实例化Bean的时候,使用反射调用构造函数实例化class,在内存中生成对象,接着给这个对象设置属性,自动装配依赖类的加载包括类的初始化,类的加载后使用前的最后一个阶段

​ 类的加载包括类的初始化,初始化是类加载后使用前的最后一个阶段
​ 类的初始化:类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中验证、准备、解析3个部分统称为连接。类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。

  1. BeanFactoryPostProcessor
    Spring允许在Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为prototype,最典型的应用应当是PropertyPlaceholderConfigurer,替换xml文件中的占位符,替换为properties文件中相应的key对应的value.
    BeanFactoryPostProcessor的执行优先级高于BeanPostProcessor
    BeanFactoryPostProcessor的postProcessBeanFactory()方法只会执行一次
    注意到postProcessBeanFactory方法是带了参数ConfigurableListableBeanFactory的,这就和之前说的可以使用BeanFactoryPostProcessor来改变Bean的属性相对应起来,ConfigurableListableBeanFactory功能非常丰富,最基本的,它携带了每个Bean的基本信息.
  2. InstantiationAwareBeanPostProcessor
    InstantiationAwareBeanPostProcessor又代表了Spring的另外一段生命周期:实例化。先区别一下Spring Bean的实例化和初始化两个阶段的主要作用:
    (1)实例化—-实例化的过程是一个创建Bean的过程,即调用Bean的构造函数,单例的Bean放入单例池中
    (2)初始化—-初始化的过程是一个赋值的过程,即调用Bean的setter,设置Bean的属性
    之前的BeanPostProcessor作用于过程(2)前后,现在的InstantiationAwareBeanPostProcessor则作用于过程(1)前后,即控制bean创建的一个过程。

InstantiationAwareBeanPostProcessor作用的是Bean实例化前后(即spring容器创建bean对象的前后),即:
​ (1)Bean构造出来之前调用postProcessBeforeInstantiation()方法
​ (2)Bean构造出来之后调用postProcessAfterInstantiation()方法
不过通常来讲不会直接实现InstantiationAwareBeanPostProcessor接口,而是会采用继承InstantiationAwareBeanPostProcessorAdapter这个抽象类的方式来使用。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值