开场白:
spring容器启动启动时候,会提供我们一些生命周期的钩子函数。开启AbstractApplicationContent.refresh()开启spring初始化,启动的过程。既然spring是基于容器技术,那么容器里面存储的肯定是对象.那么对象是怎么被加载到容器中去了呢。当前我们这里不会说对象加载到容器的全部过程。我们要知道spring给我提供了那么钩子,让我对容器进行扩展,BeanDefinitionRegistryPostPocessor.postProcessBeanDefinitionRegistry该类主要的作用提供外部添加实例对象去容器。
BeanFactoryPostProcessor.postProcessBeanFactor在对象初始化后调用。
org.springframework.context.support.PostProcessorRegistrationDelegate、BeanDefinitionRegistryPostProcessor 扩展 注册bean
Set<String> processedBeans = new HashSet<>();
// 第一步 判断该类BeanDefinitionRegistry
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 第二步 遍历所有的beanFactoryPostProcessors
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
// 第三步 判断该类是否实现了BeanDefinitionRegistryPostProcessor
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
regularPostProcessors.add(postProcessor);
}
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let the bean factory post-processors apply to them!
// Separate between BeanDefinitionRegistryPostProcessors that implement
// PriorityOrdered, Ordered, and the rest.
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
Java代码实现手动注册bean实例对象
@Service
public class BeanDefinitionRegistryPostProcessorExt implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
System.out.println("postProcessBeanDefinitionRegistry ...");
beanDefinitionRegistry.registerBeanDefinition("myBeanDefinitionRegistrar", new AnnotatedGenericBeanDefinition(SpringRedis.class));
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
SpringRedis bean = configurableListableBeanFactory.getBean(SpringRedis.class);
System.out.println("bean:" + bean);
}
}
org.springframework.beans.factory.config.BeanFactoryPostProcessor
BeanFactoryPostProcessor 他是个函数式编程
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List<org.springframework.beans.factory.config.BeanFactoryPostProcessor>)在实例化对象之前可以扩展这个接口对bean进行修改
// 第一步: 获取所有的 BeanFactoryPostProcessor
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList();
List<String> orderedPostProcessorNames = new ArrayList();
currentRegistryProcessors = new ArrayList();
postProcessorNames = postProcessorNames;
int var22 = postProcessorNames.length;
String ppName;
for(var9 = 0; var9 < var22; ++var9) {
ppName = postProcessorNames[var9];
if (!processedBeans.contains(ppName)) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
} else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
} else {
currentRegistryProcessors.add(ppName);
}
}
}
// 排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// invoke
invokeBeanFactoryPostProcessors((Collection)priorityOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList();
Iterator var23 = orderedPostProcessorNames.iterator();
实现扩展BeanFactoryPostProcessorExt 修改bean的属性
@Service
public class BeanFactoryPostProcessorExt implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("springRedis");
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
System.out.println(beanDefinition.getScope());
}
}
InstantiationAwareBeanPostProcessor