fyzzz fyzzz

记录精彩的程序人生

目录
Spring启动过程中的扩展点
/  

Spring启动过程中的扩展点

以下顺序为启动过程中的调用顺序

BeanDefinitionRegistryPostProcessor

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

注册BeanDefinition

BeanFactoryPostProcessor

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

扩展beanFactory

InstantiationAwareBeanPostProcessor

Object postProcessBeforeInstantiation(Class

实例化前,返回非null的话,就不走默认的实例化逻辑

Supplier

T get();

这是Spring提供给开发者的扩展点,如果我们要自己来实现创建对象的过程, 那么就可以提供一个Supplier的实现类,
当一个BeanDefinition中存在一个Supplier实现类的时候, Spring就利用这个类的get方法来获取实例,而不再走Spring创建对象的逻辑

通过AbstractBeanDefinition.setInstanceSupplier方法设置

MergedBeanDefinitionPostProcessor

void postProcessMergedBeanDefinition(
	 RootBeanDefinition beanDefinition, 
	 Class<?> beanType, String beanName);

运行修改合并好了的BeanDefinition,这里会查找@Autowired的注入点(InjectedElement),并把这些注入点添加到mbd的
属性externallyManagedConfigMembers中;

CommonAnnotationBeanPostProcessor,在这里找@Resource的注入点,整理@PostConstruct,@PreDestroy注解对应的方法

InstantiationAwareBeanPostProcessor

default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
}

实例化后

InstantiationAwareBeanPostProcessor

default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
			throws BeansException {
	return null;
}

调用BeanPostProcessor分别解析@Autowired、@Resource、@Value,得到属性值(依赖注入)

Aware

依次执行:

BeanNameAware

void setBeanName(String name);

BeanClassLoaderAware

void setBeanClassLoader(ClassLoader classLoader);

BeanFactoryAware

void setBeanFactory(BeanFactory beanFactory) throws BeansException;

BeanPostProcessor

default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
};

初始化前

BeanPostProcessor

default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}

初始化后


标题:Spring启动过程中的扩展点
作者:fyzzz
地址:https://fyzzz.cn/articles/2021/03/03/1614781938763.html