通常,应用程序开发人员不需要为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();
}