먼저 BeanFactory에 있는 인터페이스를 지난번 글에 살펴보았습니다.

BeanFactory 인터페이스에 있는 책임(메소드)들을 구현 해 놓은 클래스는 AbstractBeanFactory 클래스 입니다.

이 클래스에서 구현한 public boolean containsBean(String name) 메소드안에서 호출되는 메소드를 보겠습니다.

자기 자신 factory 안에서 찾을 경우 입니다.

  1. containsLocalBean(name)
    1. transformedBeanName(String name)
    2. return containsSingleton(beanName) or containsBeanDefinition(beanName)
  2. return ture

자기 자신의 factory 안에서 찾지 못할 경우 입니다.(1-2.의 return값이 false일때)

  1. containsLocalBean(name)
  2. getParentBeanFactory()
  3. return parentBeanFactory.containsBean(originalBeanName(name))
    1. transformedBeanName(name)


public String[] getAliases(String name) 메소드
를 보겠습니다.

  1. transformedBeanName(name)
  2. new ArrayList()
  3. name.startsWith(FACTORY_BEAN_PREFIX)
  4. aliases.add(fullBeanName) -> fullBeanName 이 name과 같지 않을 때만 호출 됨
  5. this.aliasMap.entrySet().iterator() -> 루프를 돌기 위한 이터레이터 가져오기
  6. (Map.Entry) it.next()
  7. entry.getKey()
  8. aliases.add(key) -> key가 name하고 같지 않을 때만 호출 됨
  9. !containsSingleton(beanName) && !containsBeanDefinition(beanName)
  10. getParentBeanFactory()
  11. aliases.addAll(Arrays.asList(parentBeanFactory.getAliases(fullBeanName)))
  12. return StringUtils.toStringArray(aliases)

public Object getBean(String name) throws BeansException 메소드
public Object getBean(String name, Class requiredType) throws BeansException 메소드를 같이 보겠습니다.

  • return getBean(name, null, null); -> getBean(String)
  • return getBean(name, requiredType, null); -> getBean(String, Class)

그래서 public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException 메소드를 보겠습니다.

  1. public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException
    1. transformedBeanName(name)
    2. getSingleton(beanName)
      1. this.singletonCache.get(beanName)
    3. 위 2번에서 호출한 메소드로부터 반환된 값이 null 이 아니면
    4. isSingletonCurrentlyInCreation(beanName)
    5. logger.isDebugEnabled()
    6. logger.debug("~~~~~");
    7. containsBeanDefinition(beanName)
    8. 위 7번에서 호출한 메소드로부터 반환된 값이 true면
    9. getMergedBeanDefinition(beanName, false)
    10. getObjectForBeanInstance(sharedInstance, name, mergedBeanDefinition)
    11. 위 7번에서 호출한 메소드로부터 반환된 값이 false면
    12. getObjectForBeanInstance(sharedInstance, name, null)
    13. required Type이 있을 경우 그 타입과 얻어진 객체와의 타입을 비교하고 같지 않으면
    14. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass())
    15. 13번에 걸리지 않으면
    16. return bean

위의 경우는 싱글톤 케시로 부터 빈을 가져오는 제일 간단한 경우였습니다. 그렇치 않은 경우는 매우 복잡하기에 다음에 알아보겠습니다.

public boolean isSingleton(String name) throws NoSuchBeanDefinitionException 메소드
를 보겠습니다.

  1. transformedBeanName(name)
  2. getSingleton(beanName) -> 반환 값을 beanInstance 변수에 대입.
  3. 위 2번에서 호출한 메소드로부터 반환된 값(beanInstance)이 null 이 아니면
  4. name이 FactoryDerefedence는 아니고 beanInstance가 FactoryBean이면
  5. BeanFactoryUtils.isFactoryDereference(name)
  6. return ((FactoryBean) beanInstance).isSingleton()
  7. 위 4번 조건에 해당하지 않으면
  8. return true

위의 경우는 싱글톤 객체를 찾았을 때의 제일 간단한 경우였습니다. 그렇치 않은 경우는상위 팩토리를 찾게 됩니다.

public Class getType(String name) throws NoSuchBeanDefinitionException 메소드를 보겠습니다.

  1. transformedBeanName(name)
  2. getSingleton(beanName)
  3. 위 2번에서 호출한 메소드로부터 반환된 값(beanInstance)이 null 이 아니면
  4. name이 FactoryDerefedence는 아니고 beanInstance가 FactoryBean이면
  5. return ((FactoryBean) beanInstance).getObjectType()
  6. 위 4번 조건에 해당하지 않으면
  7. return beanInstance.getClass()

위의 경우는 싱글톤 객체를 찾았을 때의 제일 간단한 경우였습니다. 그렇치 않은 경우는상위 팩토리를 찾게 됩니다.