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 : 오타가 많은 듯 한데 찾기가 쉽지 않군요. ㅎㅎ;;;