前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 源码脉络IOC/DI-容器的拓展

Spring 源码脉络IOC/DI-容器的拓展

作者头像
码农架构
发布2020-10-29 14:46:01
3180
发布2020-10-29 14:46:01
举报
文章被收录于专栏:码农架构

通常,应用程序开发人员不需要为ApplicationContext实现类子类。相反,Spring IoC容器可以通过插入特殊集成接口的实现来扩展。接下来的将描述这些集成接口

1BeanFactory

2ApplicationContext

3Bean创建过程

4容器扩展

5、感知接口 *Aware

6、广播与监听

7、资源

8、运行环境抽象

Spring 容器的拓展三步走

  • 后置处理器 BeanPostProcessor
  • 后置BeanFactory处理器 BeanFactoryPostPorcessor
  • FactoryBean

分割线


1️⃣ 后置Bean处理器 BeanPostProcessor

应用程序上下文可以在其bean定义中自动检测BeanPostProcessor类型的bean,并将它们应用于随后创建的任何bean

  • 针对具体的bean进行处理
代码语言:javascript
复制
public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object bean, String beanName) 
      throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) 
      throws BeansException;
}
代码语言:javascript
复制
调用逻辑
AbstractAutowireCapableBeanFactory.initializeBean
注册逻辑
PostProcessorRegistrationDelegate.registerBeanPostProcessors
  • MergedBeanDefinitionPostProcessor
代码语言:javascript
复制
void postProcessMergedBeanDefinition(
        RootBeanDefinition beanDefinition, 
        Class<?> beanType, 
        String beanName
);  
  • InstantiationAwareBeanPostProcesso

BeanPostProcessor的子接口,它添加实例化之前的调用,以及在实例化之后但在设置显式属性或自动装配之前进行的调用。 通常用于抑制特定目标Bean的默认实例化,例如创建具有特殊TargetSource的代理(池目标,延迟初始化目标等),或实现其他注入策略,例如字段注入。

  • **AwareProcessor 实现感知接口
    • ApplicationContextAwareProcessor
    • ServletContextAwareProcessor
  • ScheduledAnnotationBeanPostProcessor

思维导图

2️⃣ 后置BeanFactory处理器 BeanFactoryPostPorcessor

  • 允许自定义修改应用程序上下文的bean定义,调整bean的属性
  • 自动检测,并在创建任何非BeanFactoryPostProcessor类型bean之前应用它们
代码语言:javascript
复制
调用逻辑:
AbstractApplicationContext.refresh()
AbstractApplicationContext.invokeBeanFactoryPostProcessors
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
执行顺序:
先执行继承了BeanDefinitionRegistryPostProcessor接口的,再执行继承了BeanFactoryPostProcessor接口的实现;
先执行继承了PriorityOrdered的类,再执行继承了Ordered的类,最后执行其他的
  • BeanDefinitionRegistryPostProcessor bean注册处理器
代码语言:javascript
复制
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 
      throws BeansException;
}

BeanDefinitionRegistry ,该类的作用主要是向注册表中注册 BeanDefinition 实例,完成 注册的过程。

代码语言:javascript
复制
public interface BeanDefinitionRegistry extends AliasRegistry {

    // 关键 -> 往注册表中注册一个新的 BeanDefinition 实例
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;

    // 移除注册表中已注册的 BeanDefinition 实例
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    // 从注册中取得指定的 BeanDefinition 实例
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    // 判断 BeanDefinition 实例是否在注册表中(是否注册)
    boolean containsBeanDefinition(String beanName);

    // 取得注册表中所有 BeanDefinition 实例的 beanName(标识)
    String[] getBeanDefinitionNames();

    // 返回注册表中 BeanDefinition 实例的数量
    int getBeanDefinitionCount();

    // beanName(标识)是否被占用
    boolean isBeanNameInUse(String beanName);

}
  • 动态代理接口并注册到Spring容器
  • Mybatis mapper接口动态代理实现,MapperScannerConfigurer+MapperFactoryBean

3️⃣ FactoryBean

代码语言:javascript
复制
public interface FactoryBean<T> {
  //获取当前工厂创建的对象实例
  T getObject() throws Exception;
  //实例类型
  Class<?> getObjectType();
  //是否单例
  boolean isSingleton();
}
  • 自定义实例化逻辑
  • Mybatis mapper 接口动态代理实现,MapperFactoryBean
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档