boolean containsBean(String name) 메소드 구현 살펴보기.
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#]
[#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#]
[#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 : 오타가 많은 듯 한데 찾기가 쉽지 않군요. ㅎㅎ;;;