通常,应用程序开发人员不需要为ApplicationContext实现类子类。相反,Spring IoC容器可以通过插入特殊集成接口的实现来扩展。接下来的将描述这些集成接口
3、Bean创建过程
4、容器扩展
5、感知接口 *Aware
6、广播与监听
7、资源
8、运行环境抽象
Spring 容器的拓展三步走
分割线
1️⃣ 后置Bean处理器 BeanPostProcessor
应用程序上下文可以在其bean定义中自动检测BeanPostProcessor类型的bean,并将它们应用于随后创建的任何bean
public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
调用逻辑 AbstractAutowireCapableBeanFactory.initializeBean 注册逻辑 PostProcessorRegistrationDelegate.registerBeanPostProcessors
void postProcessMergedBeanDefinition( RootBeanDefinition beanDefinition, Class<?> beanType, String beanName );
BeanPostProcessor的子接口,它添加实例化之前的调用,以及在实例化之后但在设置显式属性或自动装配之前进行的调用。 通常用于抑制特定目标Bean的默认实例化,例如创建具有特殊TargetSource的代理(池目标,延迟初始化目标等),或实现其他注入策略,例如字段注入。
思维导图
2️⃣ 后置BeanFactory处理器 BeanFactoryPostPorcessor
调用逻辑: AbstractApplicationContext.refresh() AbstractApplicationContext.invokeBeanFactoryPostProcessors PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 执行顺序: 先执行继承了BeanDefinitionRegistryPostProcessor接口的,再执行继承了BeanFactoryPostProcessor接口的实现; 先执行继承了PriorityOrdered的类,再执行继承了Ordered的类,最后执行其他的
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; }
BeanDefinitionRegistry
,该类的作用主要是向注册表中注册 BeanDefinition 实例,完成 注册的过程。
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); }
3️⃣ FactoryBean
public interface FactoryBean<T> { //获取当前工厂创建的对象实例 T getObject() throws Exception; //实例类型 Class<?> getObjectType(); //是否单例 boolean isSingleton(); }
本文分享自微信公众号 - 码农架构(iByteCoding),作者:小码
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-04-16
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句