String[] getAliases(String name) 메소드 구현 살펴보기
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의 제일 앞 글자가 &로 시작하면 무슨일이 벌어지는 걸까요...