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

摘要

了解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接口定义如下

public interface FactoryBean<T> {
    T getObject() throws Exception;

    Class<?> getObjectType();

    boolean isSingleton();
}

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

1 BeanFactoryPostProcessor

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

void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;

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

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

2 BeanPostProcessor

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

// 前置处理
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
// 后置处理
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

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

void afterPropertiesSet() throws Exception;

6 DisposableBean

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

参考文档

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值