spring的BeanFactoryPostProcessor
学校小故事
为了了解spring流程,需要接受、了解、熟悉很多未知的定义,在此使用 学校 作为辅助,帮助我们了解spring。
<此版本中 新增BeanFactoryPostProcessor>
学校 | spring |
---|---|
学校管理局 | spring开发人员 |
学校信息 | ApplicationContext |
学校人员信息库 | DefaultListableBeanFactory |
校内人员信息 | Map<name,BeanDefinitionMap> BeanDefinitionMap |
校内人员名称 | BeanDefinitionNames |
第三方服务公司<非学生信息服务> | BeanFactoryPostProcessor |
第三方服务公司<学生信息服务> | BeanDefinitionRegistryPostProcessor |
人员 | bean |
人员信息 | BeanDefinition |
学校开学
学校开学了,学生家长、老师提供很多重复信息和可能存在的未知异常信息。
故事引申<需求出现>
问题1:学校可能收到未知异常信息。
学校:这个 A学生的信息提供有问题,今年就别让他上学了。
学生家长:不行,你的规范太繁琐了,这不怪我。
学校管理处:这是学校的问题,学校想办法解决。
第三方服务公司<BeanDefinitionRegistryPostProcessor类>:这个我可以解决,我来扫描片区内的学生,完成信息注册。
问题2:学校可能收到日期格式字符串
java中虽然字符串占较大多数,但是不意味每个对象中的所有属性都是简单数据类型,这种情况下,需要属性转换器进行格式转换。
需求问题解决
spring的十三太保之五invokeBeanFactoryPostProcessors解决。
委托第三方公司简介
所有实现 BeanFactoryPostProcessor接口类 都可以任务是 第三方服务公司<BeanFactoryPostProcessor类>
第三方服务公司<非学生信息服务>
BeanFactoryPostProcessor{
# 对BeanFactory进行自定义处理
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
}
第三方服务公司<学生信息服务>
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
# 对BeanFactory中的BeanDefinition进行自定义处理
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
}
将第三方公司信息注册到 BeanFactory中
存在两种注册方式:
1、通过xml文件或注解正常注册到校内人员信息<BeanDefinitionMap参数>;
2、重写十三太保之四<postProcessBeanFactory方法>手动注册到校内人员信息<BeanDefinitionMap参数>。
第三方公司工作位置
spring十三太保之五<invokeBeanFactoryPostProcessors方法>
spring十三太保之五 的工作内容
执行BeanDefinition中的 BeanFactoryPostProcessor和 十三太保之四<postProcessBeanFactory方法>手动注册的BeanFactoryPostProcessor。
spring十三太保之五 的工作流程
1、执行 所有BeanDefinitionRegistryPostProcessor的 postProcessBeanDefinitionRegistry 方法,按照 4 的顺序依次执行。
2、执行 十三太保之四<postProcessBeanFactory方法>手动注册的BeanFactoryPostProcessor的postProcessBeanFactory方法,按照 4 的顺序依次执行。
3、执行 BeanDefinition中的BeanFactoryPostProcessor的postProcessBeanFactory方法,按照 4 的顺序依次执行。
4、BeanFactoryPostProcessor中存在执行顺序优先级<@PriorityOrdered,@Order,没有注解的>。
PostProcessorRegistrationDelegate类中的
invokeBeanFactoryPostProcessors方法
56行~185行,整体逻辑就是上述逻辑
BFPP的BeanDefinition扫描器
扫描器之@Component: 自动扫描流程
扫描器之@Import: 自动装配流程
BFPP的属性编辑器
属性编辑器: 属性编辑器