这篇文章主要记录一些spring提供的扩展机制。
-
自定义xml标签
通过实现NamespaceHandler可以解析我们自定义xml标签,可以参考AopNamespaceHandler。
可参考《spring源码解析之构建bean(二)》 -
BeanPostProcessor
BeanPostProcessor是非常重要的扩展点,提供了postProcessBeforeInitialization/postProcessAfterInitialization方法,它们都是在AbstractAutowireCapableBeanFactory.initializeBean中调用。
注意:initializeBean在属性注入后调用
可参考《spring源码解析之构建bean(二)》
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
...
// 调用BeanNameAware,BeanClassLoaderAware,BeanFactoryAware的set方法
invokeAwareMethods(beanName, bean);
// 调用BeanPostProcessor.postProcessBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
// 调用InitializingBean/init-method方法
invokeInitMethods()
// 调用BeanPostProcessor.postProcessAfterInitialization方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
-
Aware
实现Aware接口的Bean在被实例化之后,可以取得一些相对应的资源,如BeanNameAware,在该bean初始化时会将beanName通过BeanNameAware.setBeanName注入到bean中。
如果需要在Spring中获取ApplicationContext,通常可以通过实现ApplicationContextAware类完成。
Aware接口的调用也在AbstractAutowireCapableBeanFactory.initializeBean方法。 -
InitializingBean
InitializingBean接口提供了afterPropertiesSet,在bean注入所有属性后会调用这个方法,在AbstractAutowireCapableBeanFactory.invokeInitMethods中调用。
该接口可用于构建资源,如在redis url注入后构建redis连接。
- init-method
bean节点可以使用init-method声明bean实例化后要调用的方法,也是在AbstractAutowireCapableBeanFactory.invokeInitMethods中调用。
- InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor继承于BeanPostProcessor,它添加了如下方法
postProcessBeforeInstantiation(bean构建前),
postProcessAfterInstantiation(bean构建后),
postProcessPropertyValues(属性注入前)
注意,如果postProcessBeforeInstantiation方法返回非null值,spring将不再构建bean,而使用该方法返回值作为bean。
这些方法都在AbstractAutowireCapableBeanFactory类中被调用。
- FactoryBean
FactoryBean接口提供了getObject方法,可以让我们自行构建并返回bean。spring加载到FactoryBean的beanDefinition,会调用getObject方法,并将该方法返回值作为bean。
- ConversionService
PropertyEditor可以自定义属性转换,常使用PropertyEditorSupport。
TypeConverter同样可以做类型转换。
ConversionService是Spring 3.0后提供的替代PropertyEditor的机制,推荐使用。
可以参考《spring源码解析之注入属性(三)》
线程安全值得注意: 使用线程安全的spring类型转换器ConversionService VS TypeConverter
-
BeanFactoryPostProcessor/BeanDefinitionRegistryPostProcessor
通过BeanFactoryPostProcessor对beanFactory进行自定义处理,如修改其他BeanDefinition的配置。
而BeanDefinitionRegistryPostProcessor可以注册新的BeanDefinition。
这两个接口在ClassPathXmlApplicationContext.refresh中调用。
看参考《spring源码解析之ApplicationContext(五)》 -
SmartInitializingSingleton
SmartInitializingSingleton提供了afterSingletonsInstantiated方法,在AbstractApplicationContext.refresh中调用,spring构建了non-lazy-init的单例bean后会调用调用该方法。
-
生命周期LifecycleProcessor
LifecycleProcessor可以监听ApplicationContext的生命周期onRefresh/onClose
AbstractApplicationContext.refresh会构建LifecycleProcessor并触发onClose事件。 -
事件机制ApplicationEvent/ApplicationListener
ApplicationEvent/ApplicationListener是spring提供的事件机制,可以自定义事件监听器ApplicationListener,并通过AbstractApplicationContexton.publishEvent发布事件。
AbstractApplicationContext.refresh会构建ApplicationListener。
网友评论