扩展篇 谈谈基于Spring的提供的接口

开场白:
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值