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

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

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

1140146764.bmp
AbstractBeanFactory에 구현된 boolean containsBean(String)

[#M_ more.. | less.. |
public boolean containsBean(String name) {
       if (containsLocalBean(name)) {
           return true;
       }
       // Not found -> check parent.
       BeanFactory parentBeanFactory = getParentBeanFactory();
       if (parentBeanFactory != null) {
           return parentBeanFactory.containsBean(originalBeanName(name));
       }
       return false;
   }
_M#]

containsLocalBean(String) 메소드

[#M_ more.. | less.. |
public boolean containsLocalBean(String name) {
       String beanName = transformedBeanName(name);
       return (containsSingleton(beanName) || containsBeanDefinition(beanName));
   }_M#]

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

[#M_ more.. | less.. |
public boolean containsSingleton(String beanName) {
       Assert.hasText(beanName, “Bean name must not be empty”);
       synchronized (this.singletonCache) {
           return this.singletonCache.containsKey(beanName);
       }
   }

protected abstract boolean containsBeanDefinition(String beanName);
_M#]
자기 자시의 BeanFactory에서 찾지 못할 때는 부모 BeanFactory에서 찾게 됩니다. 아래는 그림은 containsBean 메소드의 구조를 도식화 한것입니다.

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

1039256663.bmp
getParentBeanFactory() 메소드

[#M_ more.. | less.. |
public BeanFactory getParentBeanFactory() {
       return parentBeanFactory;
   }
_M#]

originalBeanName(String) 메소드

[#M_ more.. | less.. |
protected String originalBeanName(String name) {
       String beanName = transformedBeanName(name);
       if (name.startsWith(FACTORY_BEAN_PREFIX)) {
           beanName = FACTORY_BEAN_PREFIX + beanName;
       }
       return beanName;
   }
_M#]


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

[#M_ more.. | less.. |
protected String transformedBeanName(String name) {
       String beanName = BeanFactoryUtils.transformedBeanName(name);
       // Handle aliasing.
       synchronized (this.aliasMap) {
           String canonicalName = (String) this.aliasMap.get(beanName);
           return (canonicalName != null ? canonicalName : beanName);
       }
   }

//BeanFactoryUtils class

public static String transformedBeanName(String name) {
       Assert.notNull(name, “Name must not be null”);
       String beanName = name;
       if (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
           beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
       }
       return beanName;
   }
_M#]

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

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