以下接口都是在Spring生成Bean对象的过程中扮演着非常重要的角色,为什么要挑出来说?
因为Spring的IOC容器涉及到的东西非常多,而在这些东西里面我们最关注就是Bean的生成过程,Bean是怎么被扫描的? 扫描后放在哪里?在生成过程中会发生什么?所以我们需要全局的先了解一下一些核心的角色,形成一个大概的结构化思维,这对之后理解Bean生成过程的帮助会非常的大,同时Spring中类的命名是非常规范的,所以在阅读源码的时候看一下后缀,可能就知道大概是做什么的了
BeanDefinition 描述了一个Bean的实例,它记录了Bean的相关信息,并且可以设置以及获取Bean的内容,例如:Bean类名,Bean的作用域,Bean是否懒加载,,初始化方法名称,销毁方法名称,是否单例,是否原型,Bean属性值等等,直至根据BeanDefinition 生成Bean,可以说在Bean的管理中起到至关重要的作用
看名称顾名思义是用来读取Bean的信息生成BeanDefinition 的信息并注册:
这里的注册要分清楚不是注册Bean,可以理解为保存BeanDefination提供给后续的Bean生成使用
看名称是BeanDefinition注册的接口,主要是对BeanDefinition做一个管理操作,例如注册、移除、获取等,实现了AliasRegistry,即还可以对Bean的别名进行管理
DefaultListableBeanFactory即是一个Bean的工厂同时也可以完成BeanDefination注册,这个是一个很重要的角色
Bean工厂的根接口,提供了对Bean的基本操作,其实现类根据其特点基本实现了对Bean的各种操作;
以DefaultListableBeanFactory来看,基本上DefaultListableBeanFactory实现了工厂以及注册两大块类容,可以看出DefaultListableBeanFactory是多么重要的角色
从BeanFactory来看:
这个可以说是Spring容器的启动入口了,总体来说也是一个BeanFactory,但其包含了更多的其他功能,实现了更多的扩展:
两个重要的实现类:
Bean后置处理器(重中之重!!!),内部有两个方法:
源代码如下:
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
另一个实现了它的拓展接口InstantiationAwareBeanPostProcessor内部新增了4个方法:
源代码如下:
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
@Nullable
default Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
return null;
}
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
return null;
}
/** @deprecated */
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}
}
列举两个与我们平时息息相关的BeanPostProcessor:
这两个接口全是Bean的扩展点,在Bean的生命周期中发挥着至关重要的作用,所以这两个接口中的6个方法请记住,非常重要
源代码如下:
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}
名称跟上面那位大哥很像,这个也是后置处理器,但是是BeanFactory的后置处理器,对BeanFactory相关信息可以做一些修改
使用目的:在BeanFactory标准初始化之后调用,用来定制和修改BeanFactory内的内容;
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry var1) throws BeansException;
}
继承了上面那位大哥,同样会在BeanFactory之后调用,但是内部多了个对BeanDefination处理的方法,该方法可以对BeanFactory中的BeanDefination做一次后置的统一处理,该方法执行顺序在postProcessBeanFactory之前
比如@Configuration注解的原理就是通过实现BeanDefinitionRegistryPostProcessor接口,然后扫描并生成BeanDefination并注册的,具体的实现类是ConfigurationClassPostProcessor
上面的一些核心接口是不是都看懵逼了,不需要记得特别清楚,只需要知道个大概就行了:
解析Xml配置或者扫描注解生成BeanDefination加入到BeanFactory,BeanDefinitionRegistryPostProcessor对加入到BeanFactory的BeanDefination可以做增删改查操作,BeanFactoryPostProcessor可以对BeanFactory后置修改操作,然后会把BeanPostProcessor注册到BeanFactory中,最后根据BeanDefination生成Bean,在生成过程中BeanPostProcessor会起到作用
重点:分清楚BeanDefination和Bean的区别,理解几个后置处理器的生效位置
上面几个核心大概的执行顺序如下: