为什么要扩展spring?
我们在使用spring时,通常是单个注入bean,包括使用@bean注解、xml中的bean标签,以及包扫描都是在单个注入,把包扫描也归结为单个注入是因为我们也要在包中创建一个一个的类才能进行注入。
当我们想要批量操作bean时,如在mybatis在我们想要批量把dao接口更换为代理类,这样使用单个注入的方式就不合适了,就需要批量对bean进行操作,就要使用spring的扩展点。
什么是spring的扩展点?
spring容器在启动和初始化过程中会默认执行一些流程,说的直白一些就是会默认执行一些实现了某些接口的类中的方法,所以只要我们实现了某些接口并把实现了这些接口的类注入到容器中就能完成spring的注入
spring的扩展点都有哪些?
BeanDefinition与BeanFactory扩展
BeanDefinition的扩展是在spring容器在生成bean之前对bean的定义进行修改,如果我们需要对某一个或某一批BeanDefinition进行修改,就可以使用BeanDefinition的扩展。
BeanFactory扩展是对BeanFactory本身进行修改,包含对beanFactory本身的属性进行修改和对BeanDefinition进行增加和删除,对BeanFactory本身进行修改如freezeConfiguration、ignoreDependencyType等,对BeanDefinition进行增加和删除如registerBeanDefinition。
BeanFactoryPostProcessor
BeanFactoryPostProcessor相关的接口有BeanFactoryPostProcessor本身和BeanDefinitionRegistryPostProcessor,这两个接口都是在容器初始化时执行,BeanDefinitionRegistryPostProcessor负责BeanDefinition注册、删除、获取等BeanDefinition相关的操作,而BeanFactoryPostProcessor负责对BeanFactory进行修改的操作。
当spring初始化容器时会执行BeanFactoryPostProcessor的相关方法,所以我们只需要实现自己的BeanFactoryPostProcessor,然后通过applicationContext#addBeanFactoryPostProcessor方法添加到容器即可
BeanPostProcessor
BeanPostProcessor是在每个Bean初始化之前进行调用,这个时候可以修改bean的BeanDefinition,通过修改BeanDefinition实现对bean的增强,后面会有文章专门写到调用的过程
FactoryBean
当容器对bean进行初始化时,会检查bean是否属于FactoryBean这种类型,如果属于FactoryBean除了完成正常的初始化,还会对FactoryBean内的getObject方法进行调用
BeanFactory中的关键方法
ignoreType
自动注入时,忽略指定的类型
ignoreInterface
自动注入时,忽略接口中的set方法
registerResolvableDependency
注入时,指定某类型的注入值
clearMetadataCache
清除(类->beanName)缓存
设置beanDifinationMap中的bd需要重新合并
freezeConfiguration
表示之后不会对bd进行操作了,也就是不需要合并bd,并且可以直接读缓存了
isConfigurationFrozen
判断是否冻结了