View Javadoc
1   package com.atlassian.plugin.osgi.spring;
2   
3   import org.springframework.beans.factory.BeanFactoryAware;
4   import org.springframework.beans.factory.config.BeanDefinition;
5   import org.springframework.beans.factory.config.BeanPostProcessor;
6   import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
7   import org.springframework.beans.factory.support.BeanDefinitionRegistry;
8   import org.springframework.beans.factory.support.RootBeanDefinition;
9   
10  import java.util.function.Supplier;
11  
12  final class BeanFactoryPostProcessorUtils {
13      private BeanFactoryPostProcessorUtils() {
14      }
15  
16      static <T extends BeanPostProcessor> void registerPostProcessor(
17              final ConfigurableListableBeanFactory beanFactory,
18              final String beanName,
19              final Class<T> beanClass,
20              final Supplier<T> postProcessorSupplier) {
21          
22          if (beanFactory instanceof BeanDefinitionRegistry) {
23              final BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
24              // register the annotation processor using the name AnnotationConfigUtils uses internally. This ensures that
25              // only one instance of this bean is registered
26              if (!registry.containsBeanDefinition(beanName)) {
27                  final RootBeanDefinition def = new RootBeanDefinition(beanClass);
28                  def.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
29                  registry.registerBeanDefinition(beanName, def);
30              }
31          } else {
32              final BeanPostProcessor postProcessor = postProcessorSupplier.get();
33              if (postProcessor instanceof BeanFactoryAware) {
34                  ((BeanFactoryAware)postProcessor).setBeanFactory(beanFactory);
35              }
36              beanFactory.addBeanPostProcessor(postProcessor);
37          }
38      }
39  }