Whiteship's Note


BeanFactory를 구현한 메소드 살펴보기

Spring/Mission : 2006. 10. 31. 17:45


먼저 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()
위의 경우는 싱글톤 객체를 찾았을 때의 제일 간단한 경우였습니다. 그렇치 않은 경우는상위 팩토리를 찾게 됩니다.

top

Write a comment.


boolean containsBean(String name) 메소드 구현 살펴보기.

Spring/Mission : 2006. 10. 26. 11:52


BeanFactory 인터페이스에 있는 메소드의 구현을 살펴보겠습니다.

String[] getAliases(String name) 메소드는 name으로 참조 되는 bean의 다른 이름들 즉 별명들을 String 배열로 반환하는 메소드 입니다. name으로 넘겨진 값이별명 중에 하나였다면 그에 상응하는 bean의 원래 name과별명들을 같이 반환합니다. 이때 원래 name은 배열의 제일처음에 위치합니다. 이 메소드 또한 현재 BeanFactory에서해당하는 bean을 찾지 못한다면 부모 BeanFactory에서찾게 됩니다.

Best 시나리오 일때는 자기 자신의 favtory안에서 String type의 매개변수에 해당하는 bean을 찾을 겨우 입니다. 이때는 다음과 같은 메소드 호출 Stack으로 파악할 수 있습니다.


AbstractBeanFactory에 구현된 boolean containsBean(String)


containsLocalBean(String) 메소드


containsSingleton(String) 메소드 와 containsBeanDefinition(String) 메소드


자기 자시의 BeanFactory에서 찾지 못할 때는 부모 BeanFactory에서 찾게 됩니다. 아래는 그림은 containsBean 메소드의 구조를 도식화 한것입니다.


containsBean 메소드에 넘어온 매개변수를 originalBeanName 메소드의 인자로 전해주고(파란선) 그 결과 값을 다시 parentBeanFacory.containsBean(String) 메소드의 인자로 넘겨줍니다.(빨간선)
parentBeanFactory.containsBean(String) 이부분을 Stack 구조로 나타내면 다음과 같습니다.


getParentBeanFactory() 메소드


originalBeanName(String) 메소드


AbstractBeanFactory transformedBeanName(String) 메소드와BeanFactoryUtils에 있는 transformedBeanName(String) 메소드




ps : BeanFactory 인터페이스를 구현한 AstractBeanFactory에 있는 method들을 살펴보았습니다.
앞서 궁금해 했던 BeanFactory.FACTORY_BEAN_PREFIX 이 필드를 사용하는 것을 볼 수 있는데요. &를 생성하고자 하는 Bean name앞에 붙여서 getBean을 하게 되면 어떻게 되는건지 해봐야겠네요.

ps : 오타가 많은 듯 한데 찾기가 쉽지 않군요. ㅎㅎ;;;

top

  1. Favicon of https://springframework.tistory.com BlogIcon 영회 2006.10.26 00:44 신고 PERM. MOD/DEL REPLY

    조금 간결해졌으면 좋겠고.. ^^
    어떤 흐름으로 메소드가 호출되는지 볼 수 있으면 더 좋겠구나.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.26 08:38 신고 PERM MOD/DEL

    네~ Simple.. and Visual

Write a comment.