关于前端:Spring-扩展点之-BeanFactoryPostProcessor

41次阅读

共计 4932 个字符,预计需要花费 13 分钟才能阅读完成。

1、Spring 扩大点之 BeanFactoryPostProcessor
1.1、BeanDefinitionRegistryPostProcessor
该类实际上是继承了 BeanFactoryPostProcessor 的,并且在原有的办法上增加了一个 postProcessBeanDefinitionRegistry 办法。

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

该办法是在所有惯例 Bean 定义信息被加载然而还未被实例化的时候调用。

作用:增加、批改 Bean 的定义信息。

源码调用处:PostProcessorRegistrationDelegate 的 invokeBeanFactoryPostProcessors 办法,这里的 BeanFactoryPostProcessor 是在初始化类一些类的时候增加到 beanFactoryPostProcessors 的。

for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {

            if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                BeanDefinitionRegistryPostProcessor registryProcessor =
                        (BeanDefinitionRegistryPostProcessor) postProcessor;

// 这里调用

                registryProcessor.postProcessBeanDefinitionRegistry(registry);
                registryProcessors.add(registryProcessor);
            }
            else {regularPostProcessors.add(postProcessor);
            }
        }

咱们来看下 Spring 默认加载的一些子类:

CachingMetadataReaderFactoryPostProcessor

SharedMetadataReaderFactoryContextInitializer 的外部类。

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
this.register(registry);
this.configureConfigurationClassPostProcessor(registry);
}
private void register(BeanDefinitionRegistry registry) {

        BeanDefinition definition = BeanDefinitionBuilder.genericBeanDefinition(SharedMetadataReaderFactoryContextInitializer.SharedMetadataReaderFactoryBean.class, SharedMetadataReaderFactoryContextInitializer.SharedMetadataReaderFactoryBean::new).getBeanDefinition();
        registry.registerBeanDefinition(&Rth;org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory&Rth;, definition);
    }
    private void configureConfigurationClassPostProcessor(BeanDefinitionRegistry registry) {
        try {BeanDefinition definition = registry.getBeanDefinition(&Rth;org.springframework.context.annotation.internalConfigurationAnnotationProcessor&Rth;);
            definition.getPropertyValues().add(&Rth;metadataReaderFactory&Rth;, new RuntimeBeanReference(&Rth;org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory&Rth;));
        } catch (NoSuchBeanDefinitionException var3) {}}

咱们发现它的作用就是增加了一个 org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory 的 Bean 定义信息,而后就是增加了个 PropertyValue -> metadataReaderFactory

ConfigurationWarningsPostProcessor

ConfigurationWarningsApplicationContextInitializer 的外部类。

@Override

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {for (Check check : this.checks) {String message = check.getWarning(registry);
            if (StringUtils.hasLength(message)) {warn(message);
            }
        }
    }
    private void warn(String message) {if (logger.isWarnEnabled()) {logger.warn(String.format(&Rth;%n%n** WARNING ** : %s%n%n&Rth;, message));
        }
    }

点进去发现(当初只有一个 Check 对象)它的作用是拿到所有的 ComponentScan 注解属性,而后检测它是否是 org.springframework 或者 org,如果是则会打印异样信息 Your ApplicationContext is unlikely to start due to a @ComponentScan of。

代码往下走,上面有三处调用 BeanDefinitionRegistryPostProcessor 类的,调用规定是先调用实现了 PriorityOrdered 接口的类,而后再调用 Ordered 的接口的类,最初就是残余的 BeanDefinitionRegistryPostProcessor 类了。如果同时实现了 PriorityOrdered 与 Ordered,那么被调用过一次就不会再调用。

通过这个办法去遍历调用 postProcessBeanDefinitionRegistry。这里调用的 BeanDefinitionRegistryPostProcessor 是在 beanFactory 中拿的所有的与之匹配的类型,与下面的不一样。

invokeBeanDefinitionRegiwww.walajiao.comstryPostProcessors(currentRegistryProcessors, registry);

1.2、BeanFactoryPostProcessor
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

该办法调用时也是 Bean 定义信息已加载,并且还没有 Bean 被实例化。然而官网注解说是能够在这里先实例化 Bean 的。

This allows for overriding or adding properties even to eager-initializing beans.

接着下面的代理持续往下走,invokeBeanFactoryPostProcessors 是调用 postProcessBeanFactory 办法回调的,这里调用的是下面 BeanDefinitionRegistryPostProcessor 类型的 postProcessBeanFactory 办法,因为 BeanDefinitionRegistryPostProcessor 是继承了 BeanFactoryPostProcessor 的游戏代理的接口的,并且也没有默认实现父接口的办法,所以在实现 BeanDefinitionRegistryPostProcessor 接口的时候也要实现 postProcessBeanFactory 办法。

持续往下走,和 BeanDefinitionRegistryPostProcessor 类是一样的,它从 beanFactory 中拿所有 BeanFactoryPostProcessor 类型的 Bean,而后依据实现 PriorityOrdered、Ordered 顺序调用,应用 invokeBeanFactoryPostProcessors 办法去遍历调用 postProcessBeanFactory 办法。

来看下 Spring 默认加载的一些 BeanFactoryPostProcessor。

EventListenerMethodProcessor

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {

    this.beanFactory = beanFactory;
    Map<String, EventListenerFactory> beans = beanFactory.getBeansOfType(EventListenerFactory.class, false, false);
    List<EventListenerFactory> factories = new ArrayList<>(beans.values());
    AnnotationAwareOrderComparator.sort(factories);
    this.eventListenerFactories = factories;
}

外面就初始化了本人的 eventListenerFactories 属性。

以上总结:Spring 的 BeanDefinitionRegistryPostProcessor 与 BeanFactoryPostProcessor 的实现类办法的调用程序是 -> 先调用 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 办法,程序是 PriorityOrdered > Ordered > 其余。外部依据 order 值来判断程序。再调用 BeanDefinitionRegistryPostProcessor 的 postProcessBeanFactory 办法,程序判断也是一样。最初执行 BeanFactoryPostProcessor 的 postProcessBeanFactory 办法。

正文完
 0