【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应用
还没有评论,来说两句吧...