1   package com.atlassian.spring.container;
2   
3   import org.springframework.beans.BeansException;
4   import org.springframework.beans.factory.BeanFactory;
5   import org.springframework.beans.factory.HierarchicalBeanFactory;
6   import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
7   import org.springframework.beans.factory.support.DefaultListableBeanFactory;
8   
9   /**
10   * A custom {@link BeanFactory} used in the {@link SpringContainerContext}. The factory has:
11   * An extra createBeanMethod
12   */
13  public class AtlassianBeanFactory extends DefaultListableBeanFactory
14  {
15      public AtlassianBeanFactory(AutowireCapableBeanFactory beanFactory)
16      {
17          super(beanFactory);
18      }
19  
20      /**
21       * Behaves as {@link AutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(Object, String)} but it
22       * also calls the {@link #parentBeanFactory}'s version if it's a {@link AutowireCapableBeanFactory}
23       */
24      public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
25              throws BeansException
26      {
27          existingBean = super.applyBeanPostProcessorsBeforeInitialization(existingBean, beanName);
28  
29          BeanFactory parentBeanFactory = getParentBeanFactory();
30          while (parentBeanFactory != null)
31          {
32              if (parentBeanFactory instanceof AutowireCapableBeanFactory)
33              {
34                  AutowireCapableBeanFactory autowireCapableParentFactory = (AutowireCapableBeanFactory) parentBeanFactory;
35                  existingBean = autowireCapableParentFactory.applyBeanPostProcessorsBeforeInitialization(existingBean, beanName);
36              }
37  
38              if (parentBeanFactory instanceof HierarchicalBeanFactory)
39              {
40                  parentBeanFactory = ((HierarchicalBeanFactory)parentBeanFactory).getParentBeanFactory();
41              }
42              else
43              {
44                  parentBeanFactory = null;
45              }
46          }
47  
48          return existingBean;
49      }
50  
51      /**
52       * Behaves as {@link AutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization(Object, String)} but it 
53       * also calls the {@link #parentBeanFactory}'s version if it's a {@link AutowireCapableBeanFactory}
54       */
55      public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
56              throws BeansException
57      {
58          existingBean = super.applyBeanPostProcessorsAfterInitialization(existingBean, beanName);
59  
60          BeanFactory parentBeanFactory = getParentBeanFactory();
61          while (parentBeanFactory != null)
62          {
63              if (parentBeanFactory instanceof AutowireCapableBeanFactory)
64              {
65                  AutowireCapableBeanFactory autowireCapableParentFactory = (AutowireCapableBeanFactory) parentBeanFactory;
66                  existingBean = autowireCapableParentFactory.applyBeanPostProcessorsAfterInitialization(existingBean, beanName);
67              }
68  
69              if (parentBeanFactory instanceof HierarchicalBeanFactory)
70              {
71                  parentBeanFactory = ((HierarchicalBeanFactory) parentBeanFactory).getParentBeanFactory();
72              }
73              else
74              {
75                  parentBeanFactory = null;
76              }
77          }
78  
79          return existingBean;
80      }
81  
82  
83      public String toString()
84      {
85          return "toString overridden for performance reasons";
86      }
87  }