BeanFactory를 구현한 메소드 살펴보기
먼저 BeanFactory에 있는 인터페이스를 지난번 글에 살펴보았습니다.
BeanFactory 인터페이스에 있는 책임(메소드)들을 구현 해 놓은 클래스는 AbstractBeanFactory 클래스 입니다.
이 클래스에서 구현한 public boolean containsBean(String name) 메소드안에서 호출되는 메소드를 보겠습니다.
자기 자신 factory 안에서 찾을 경우 입니다.
- containsLocalBean(name)
- transformedBeanName(String name)
- return containsSingleton(beanName) or containsBeanDefinition(beanName)
- return ture
자기 자신의 factory 안에서 찾지 못할 경우 입니다.(1-2.의 return값이 false일때)
- 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()
위의 경우는 싱글톤 객체를 찾았을 때의 제일 간단한 경우였습니다. 그렇치 않은 경우는상위 팩토리를 찾게 됩니다.