【Spring IOC容器学习笔记】四——容器拓展接口

ゞ 浴缸里的玫瑰 2021-12-12 00:17 362阅读 0赞

摘要

了解Spring容器的扩展点可以帮助我们完成特定任务,如何精通 Spring 就看你有没有掌握好 Spring 有哪些扩展点。
Spring Ioc 容器主要有这么几个拓展点:BeanFactoryPostProcessor和BeanPostProcessor,他们分别是在构建 BeanFactory 和构建 Bean 对象时调用;还有就是 InitializingBean 和 DisposableBean, 他们分别是在 Bean 实例创建和销毁时被调用。用户可以实现这些接口中定义的方法,Spring 就会在适当的时候调用他们。还有一个是 FactoryBean 他是个特殊的 Bean,这个 Bean 可以被用户更多的控制。

0 FactoryBean

Spring中有两种类型的bean,普通bean和工厂bean(实现FactoryBean接口)。普通bean实例化返回的是bean类型的一个对象,而工厂bean返回的是getObject()方法返回的对象。FactoryBean接口定义如下

  1. public interface FactoryBean<T> {
  2. T getObject() throws Exception;
  3. Class<?> getObjectType();
  4. boolean isSingleton();
  5. }

FactoryBean可以用来创建比较复杂的对象,普通bean的配置通过XML文件即可。如果一个bean的实例化配置需要涉及很多其他bean及复杂的逻辑,用XML配置的方式搞不定,可以考虑实现FactoryBean接口,实现getObject()方法来获取bean实例。
关于FactoryBean的使用示例,可以参考Spring FactoryBean应用。

1 BeanFactoryPostProcessor

允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做一些额外的操作,比如修改bean定义的某些属性或者增加其他信息等。接口定义了如下方法

  1. void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;

重写该方法,就可以获取BeanFactory进行额外操作

因为容器中可能有多个BeanFactoryPostProcessor,可能还需要实现org.springframework.core.Ordered接口,以保证BeanFactoryPostProcessor按照顺序执行

2 BeanPostProcessor

存在于对象实例化阶段, 处理容器内所有符合条件并且已经实例化后的对象,定义了两个接口

  1. // 前置处理
  2. Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
  3. // 后置处理
  4. Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

3 bean生命周期

BeanFactoryPostProcessor接口处理后,容器开始实例化bean对象,每个bean的生命周期如下图
在这里插入图片描述
下面介绍图中的其他拓展接口。

4 Aware接口

常见的有BeanNameAware、BeanFactoryAware、ApplicationContextAware接口。

  • 如果Bean实现了BeanNameAware接口,会回调该接口的setBeanName()方法,传入该Bean的id,此时该Bean就获得了自己在配置文件中的id
  • 如果Bean实现了BeanFactoryAware接口,会回调该接口的setBeanFactory()方法,传入该Bean的BeanFactory,这样该Bean就获得了自己所在的BeanFactory
  • 如果Bean实现了ApplicationContextAware接口,会回调该接口的setApplicationContext()方法,传入该Bean的ApplicationContext,这样该Bean就获得了自己所在的ApplicationContext

5 InitializingBean

定义了如下无参的无返回的方法,可以在初始化前做些额外动作。

  1. void afterPropertiesSet() throws Exception;

6 DisposableBean

定义了无参无返回的destroy()方法,可以在自定义的destroy方法前做些额外动作。

参考文档

1,Spring Bean生命周期
2, 一份Spring Boot知识清单
3, Spring FactoryBean应用

发表评论

表情:
评论列表 (有 0 条评论,362人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring3.X学习笔记-IoC容器概述

    > 2017即将接近尾声,每当年末的时候总要检查下今年还有什么事情没做,结果却发现今年好像也没做多少事情。于是就想着把之前一直想梳理的Spring知识,趁着年末好好整理下。本系

    相关 Spring IOC容器

    IOC(控制反转):不负责对象的创建,只负责使用,由外部容器创建 DI(依赖注入):创建对象并且组装对象之间的关系        ![watermark_type