BeanFactory 인터페이스에 있는 메소드들을 어떻게 구현했나 살펴보고 있습니다.

[#M_ more.. | less.. |
public String[] getAliases(String name) {
       String beanName = transformedBeanName(name);
       List aliases = new ArrayList();
       boolean factoryPrefix = name.startsWith(FACTORY_BEAN_PREFIX);
       String fullBeanName = beanName;
       if (factoryPrefix) {
           fullBeanName = FACTORY_BEAN_PREFIX + beanName;
       }
       if (!fullBeanName.equals(name)) {
           aliases.add(fullBeanName);
       }
       synchronized (this.aliasMap) {
           for (Iterator it = this.aliasMap.entrySet().iterator(); it.hasNext();) {
               Map.Entry entry = (Map.Entry) it.next();
               if (entry.getValue().equals(beanName)) {
                   String key = (factoryPrefix ? FACTORY_BEAN_PREFIX : “”) + entry.getKey();
                   if (!key.equals(name)) {
                       aliases.add(key);
                   }
               }
           }
       }
       if (!containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
           BeanFactory parentBeanFactory = getParentBeanFactory();
           if (parentBeanFactory != null) {
               aliases.addAll(Arrays.asList(parentBeanFactory.getAliases(fullBeanName)));
           }
       }
       return StringUtils.toStringArray(aliases);
   }
_M#]
if (!fullBeanName.equals(name)) {
           aliases.add(fullBeanName);
       }
저는 이부분이 이해가 잘 안가네요.

name은 매개변수로 받아온 이름이고 만약에 그 name이 &로 시작을 하면 fullBeanName은 transformedBeanName(String) 메소드 호출하여 반환 된 값을 참조하는 beanName에 &를 붙인 값이 됩니다.

그런데 transformedBeanName(String) 메소드는 아래에 보시다시피 &로 시작하는 name이 오면 맨 앞에 &를 제외한 상태로 문자열을 반환하게 됩니다.

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#]
그렇게 때문에 if (!fullBeanName.equals(name)) 여기서 어떻게 name하고 fullName하고 달라질 수가 있는지.. 모르겠네요.

이 메소드에서 호출되는 다른 메소드 들도 containsBean(String) 메소드에서 확인바 있습니다.

ps : 이 메소드에서도 역시 제가 아직 풀지 못한 수수께끼.. FACTORY_BEAN_PREFIX  이 변수와 관련해서 name으로 받아온 String의 제일 앞 글자가 &로 시작하면 무슨일이 벌어지는 걸까요…