美文网首页Spring-Boot
spring扩展机制

spring扩展机制

作者: binecy | 来源:发表于2019-03-31 10:02 被阅读3次

这篇文章主要记录一些spring提供的扩展机制。

  1. 自定义xml标签
    通过实现NamespaceHandler可以解析我们自定义xml标签,可以参考AopNamespaceHandler。
    可参考《spring源码解析之构建bean(二)》

  2. 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);    

}
  1. Aware
    实现Aware接口的Bean在被实例化之后,可以取得一些相对应的资源,如BeanNameAware,在该bean初始化时会将beanName通过BeanNameAware.setBeanName注入到bean中。
    如果需要在Spring中获取ApplicationContext,通常可以通过实现ApplicationContextAware类完成。
    Aware接口的调用也在AbstractAutowireCapableBeanFactory.initializeBean方法。

  2. InitializingBean
    InitializingBean接口提供了afterPropertiesSet,在bean注入所有属性后会调用这个方法,在AbstractAutowireCapableBeanFactory.invokeInitMethods中调用。
    该接口可用于构建资源,如在redis url注入后构建redis连接。

  1. init-method
    bean节点可以使用init-method声明bean实例化后要调用的方法,也是在AbstractAutowireCapableBeanFactory.invokeInitMethods中调用。
  1. InstantiationAwareBeanPostProcessor
    InstantiationAwareBeanPostProcessor继承于BeanPostProcessor,它添加了如下方法
    postProcessBeforeInstantiation(bean构建前),
    postProcessAfterInstantiation(bean构建后),
    postProcessPropertyValues(属性注入前)
    注意,如果postProcessBeforeInstantiation方法返回非null值,spring将不再构建bean,而使用该方法返回值作为bean。
    这些方法都在AbstractAutowireCapableBeanFactory类中被调用。
  1. FactoryBean
    FactoryBean接口提供了getObject方法,可以让我们自行构建并返回bean。spring加载到FactoryBean的beanDefinition,会调用getObject方法,并将该方法返回值作为bean。
  1. ConversionService
    PropertyEditor可以自定义属性转换,常使用PropertyEditorSupport。
    TypeConverter同样可以做类型转换。
    ConversionService是Spring 3.0后提供的替代PropertyEditor的机制,推荐使用。
    可以参考《spring源码解析之注入属性(三)》

线程安全值得注意: 使用线程安全的spring类型转换器ConversionService VS TypeConverter

  1. BeanFactoryPostProcessor/BeanDefinitionRegistryPostProcessor
    通过BeanFactoryPostProcessor对beanFactory进行自定义处理,如修改其他BeanDefinition的配置。
    而BeanDefinitionRegistryPostProcessor可以注册新的BeanDefinition。
    这两个接口在ClassPathXmlApplicationContext.refresh中调用。
    看参考《spring源码解析之ApplicationContext(五)》

  2. SmartInitializingSingleton
    SmartInitializingSingleton提供了afterSingletonsInstantiated方法,在AbstractApplicationContext.refresh中调用,spring构建了non-lazy-init的单例bean后会调用调用该方法。

  1. 生命周期LifecycleProcessor
    LifecycleProcessor可以监听ApplicationContext的生命周期onRefresh/onClose
    AbstractApplicationContext.refresh会构建LifecycleProcessor并触发onClose事件。

  2. 事件机制ApplicationEvent/ApplicationListener
    ApplicationEvent/ApplicationListener是spring提供的事件机制,可以自定义事件监听器ApplicationListener,并通过AbstractApplicationContexton.publishEvent发布事件。
    AbstractApplicationContext.refresh会构建ApplicationListener。

相关文章

网友评论

    本文标题:spring扩展机制

    本文链接:https://www.haomeiwen.com/subject/giommqtx.html