BeanFactory를 구현한 메소드 살펴보기
Spring/Mission : 2006. 10. 31. 17:45
먼저 BeanFactory에 있는 인터페이스를 지난번 글에 살펴보았습니다.
BeanFactory 인터페이스에 있는 책임(메소드)들을 구현 해 놓은 클래스는 AbstractBeanFactory 클래스 입니다.
이 클래스에서 구현한 public boolean containsBean(String name) 메소드안에서 호출되는 메소드를 보겠습니다.
자기 자신 factory 안에서 찾을 경우 입니다.
public String[] getAliases(String name) 메소드를 보겠습니다.
public Object getBean(String name) throws BeansException 메소드와
public Object getBean(String name, Class requiredType) throws BeansException 메소드를 같이 보겠습니다.
그래서 public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException 메소드를 보겠습니다.
public boolean isSingleton(String name) throws NoSuchBeanDefinitionException 메소드를 보겠습니다.
public Class getType(String name) throws NoSuchBeanDefinitionException 메소드를 보겠습니다.
BeanFactory 인터페이스에 있는 책임(메소드)들을 구현 해 놓은 클래스는 AbstractBeanFactory 클래스 입니다.
이 클래스에서 구현한 public boolean containsBean(String name) 메소드안에서 호출되는 메소드를 보겠습니다.
자기 자신 factory 안에서 찾을 경우 입니다.
- containsLocalBean(name)
- transformedBeanName(String name)
- return containsSingleton(beanName) or containsBeanDefinition(beanName)
- return ture
- containsLocalBean(name)
- getParentBeanFactory()
- return parentBeanFactory.containsBean(originalBeanName(name))
- transformedBeanName(name)
public String[] getAliases(String name) 메소드를 보겠습니다.
- transformedBeanName(name)
- new ArrayList()
- name.startsWith(FACTORY_BEAN_PREFIX)
- aliases.add(fullBeanName) -> fullBeanName 이 name과 같지 않을 때만 호출 됨
- this.aliasMap.entrySet().iterator() -> 루프를 돌기 위한 이터레이터 가져오기
- (Map.Entry) it.next()
- entry.getKey()
- aliases.add(key) -> key가 name하고 같지 않을 때만 호출 됨
- !containsSingleton(beanName) && !containsBeanDefinition(beanName)
- getParentBeanFactory()
- aliases.addAll(Arrays.asList(parentBeanFactory.getAliases(fullBeanName)))
- return StringUtils.toStringArray(aliases)
public Object getBean(String name) throws BeansException 메소드와
public Object getBean(String name, Class requiredType) throws BeansException 메소드를 같이 보겠습니다.
- return getBean(name, null, null); -> getBean(String)
- return getBean(name, requiredType, null); -> getBean(String, Class)
그래서 public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException 메소드를 보겠습니다.
- public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException
- transformedBeanName(name)
- getSingleton(beanName)
- this.singletonCache.get(beanName)
- 위 2번에서 호출한 메소드로부터 반환된 값이 null 이 아니면
- isSingletonCurrentlyInCreation(beanName)
- logger.isDebugEnabled()
- logger.debug("~~~~~");
- containsBeanDefinition(beanName)
- 위 7번에서 호출한 메소드로부터 반환된 값이 true면
- getMergedBeanDefinition(beanName, false)
- getObjectForBeanInstance(sharedInstance, name, mergedBeanDefinition)
- 위 7번에서 호출한 메소드로부터 반환된 값이 false면
- getObjectForBeanInstance(sharedInstance, name, null)
- required Type이 있을 경우 그 타입과 얻어진 객체와의 타입을 비교하고 같지 않으면
- throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass())
- 13번에 걸리지 않으면
- return bean
public boolean isSingleton(String name) throws NoSuchBeanDefinitionException 메소드를 보겠습니다.
- transformedBeanName(name)
- getSingleton(beanName) -> 반환 값을 beanInstance 변수에 대입.
- 위 2번에서 호출한 메소드로부터 반환된 값(beanInstance)이 null 이 아니면
- name이 FactoryDerefedence는 아니고 beanInstance가 FactoryBean이면
- BeanFactoryUtils.isFactoryDereference(name)
- return ((FactoryBean) beanInstance).isSingleton()
- 위 4번 조건에 해당하지 않으면
- return true
public Class getType(String name) throws NoSuchBeanDefinitionException 메소드를 보겠습니다.
- transformedBeanName(name)
- getSingleton(beanName)
- 위 2번에서 호출한 메소드로부터 반환된 값(beanInstance)이 null 이 아니면
- name이 FactoryDerefedence는 아니고 beanInstance가 FactoryBean이면
- return ((FactoryBean) beanInstance).getObjectType()
- 위 4번 조건에 해당하지 않으면
- return beanInstance.getClass()
'Spring > Mission' 카테고리의 다른 글
AOP와 AJAX가 가용한 Spring Controller (0) | 2007.09.11 |
---|---|
Guice와 Spring JavaConfig의 DI 스타일 비교 (0) | 2007.03.21 |
Spring Reference 정리 (4) | 2007.03.09 |
Spring Framework 소스코드 CVS로 다운받기 (1) | 2006.11.24 |
XmlBeanFactory 클래스 살펴보기 (0) | 2006.11.02 |
BeanFactory를 구현한 메소드 살펴보기 (0) | 2006.10.31 |
Object getBean(String name) 메소드 구현 살펴보기-중간 부분 (0) | 2006.10.30 |
Object getBean(String name) 메소드 구현 살펴보기-윗 부분 (0) | 2006.10.27 |
BeanFactory와 AbstractBeanFactory의 관계 (0) | 2006.10.26 |
String[] getAliases(String name) 메소드 구현 살펴보기 (0) | 2006.10.26 |
boolean containsBean(String name) 메소드 구현 살펴보기. (2) | 2006.10.26 |