Whiteship's Note


Dynamic refreshing of application contexts

Spring/Mission : 2008. 4. 16. 19:04


http://jira.springframework.org/browse/SPR-94

어서 구현해주길 바라는 스프링의 기능 중에 하나로 주시하고 있는 기능입니다. (특정 이슈를 주시하고 있으려면 JIRA에서 Watch 기능을 사용하면되죠. 변경사항이 있으면 메일이 날아옵니다.) application context를 동적으로 수정할 수 있는 기능 입니다. 좀 더 구체적으로 XML이든 JavaConfic이든 어떤 빈 설정파일들을 주기적으로 다시 읽어주는 기능입니다. 현재 스프링 3.0 M2 일정에 잡혀있습니다. 리포터를 로드존슨이고 담당자는 Pro Spring 저자 롭 하랍입니다.
top

Write a comment.


AOP와 AJAX가 가용한 Spring Controller

Spring/Mission : 2007. 9. 11. 22:06


이번 스프링 세미나에서 만난 리오님과 나눈 잠깐의 대화에서 예전에 Spring Controller에 AOP를 적용하려다 실패해서 필터로 로깅 처리를 했던 일이 생각났습니다. 그리고 어머니 일을 돕던 중에 문득 'Spring에서 AJAX는 어떻게 사용하지?' 라는 궁금증이 생겼습니다.

이 두 개의 궁금증을 한 방에 해결할 수 있는 아티클을 발견했습니다.
AOP / AJAX Enabled Controllers in Spring MVC
AOP Enabled Form Controllers in Spring MVC

다시 헤딩의 시작인가..ㄷㄷㄷ...


top

Write a comment.


Guice와 Spring JavaConfig의 DI 스타일 비교

Spring/Mission : 2007. 3. 21. 09:14


원문은 Guice vs. Spring JavaConfig: A comparison of DI styles 이런 제목으로 올라왔습니다. 다소 기다란 글로 다 읽진 못했습니다. 대강 훝기만 했죠.

Spring In Action 책 초반에 나오는 Knight 예제를 구글 Guice와 Spring의 Configurationd을 XML이 아닌 Java로 어노테이션을 사용하여 할 수 있도록 하는 JavaConfig를 사용하여 비교한 글입니다.

비교된 항목은
1. String Identifier : both Guice and Spring JavaConfig register a win in this category, as neither relies on String identifiers in their configuration and both are easily refactorable through modern IDEs. 둘 다 비슷!

2. Speed/Performance : bean 생성할 때 여러 life cycle을 제공하는 spring이 당연히 단순하게 묶기만 하는 guice보다 느릴 수 밖에... Guice 승!

3. JAR file footprint : 예제(aop와 di사용한 예제)를 돌릴 때 필요한 jar 파일 갯수로..Guice는 딱 두 개 필요하고 spring은 spring-javaconfig.jar, spring-beans.jar, spring-aop.jar, spring-core.jar, spring-context.jar, commons-logging.jar, aopalliance.jar, asm-2.2.2jar, cglib-nodep-2.1_3.jar, and aspectjweaver.jar 좀.. 많이 필요하군요. Guice가 Spring보다 훨씬 가볍다고 할 수 있겠네요. Guice 승!

4. Non-intrusive : AOP에서 injection 되는 클래스가 Guice에 종속된다는 군요. 따라서 재사용 할 수도 없고 Guice.jar파일 없으면 컴파일도 안된다는군요. Spring 승!

5. Third-party beans : Third-party 빈에 속성을 DI 할 때 SpringConfig는 전혀 불편함을 못느꼈으나.. Guice로는 어려웠다. Spring 승!

6. Constant/literal injection : Injection할 때 Guice의 어노테이션 사용이 다소 불편한 것이 있다봅니다. Spring 승!

7. AOP : Spring이나 Guice나 둘 다 AspectJ에는 비교할 수 없지만 Guice는 공식 문서에서도 AOP가 Spring에 비해 좀 딸린다고 알렸고 그게 오히려 단순함을 추구하는 추세라고 했지만...어노테이션 붙이는게 복잡한다 봅니다. Spring 승!

결국 Spring이 DI와 AOP 기능만 Guice와 비교 해봤을 때 4승 1무 2패로 이겼네요.

이글의 밑에는 미친밥이 직접와서 리플도 달아놨군요. 흠.. 거기까지 읽기가 귀찮네요.
top

TAG AOP, DI, Guice, Spring

Write a comment.


Spring Reference 정리

Spring/Mission : 2007. 3. 9. 15:38


사용자 삽입 이미지
현재 Chapter 3을 정리하고 있습니다. Reference 분량이 엄청나군요~ 500페이지..ㅠ.ㅠ

http://agilejava.googlecode.com/svn/  <= SVN URL
http://code.google.com/p/agilejava/  <= Project Home

사용자 삽입 이미지
위 주소의 svn repository에는 현재 정리 중인 Spring Reference 정리를 위해 사용중인 예제 코드. - Spring Study

테스트 주도 개발 1장~17장 까지 Money 예제 소스 코드 연습 한 것. - TDD

테스트 주도 개발 18장~20장 까지 xUnit 예제 소스 코드 연습 한 것. - xUnit

만들다 만 주소록. - addressbook & webAddressBook

Tdd 도우미 - TddHelper

랜덤 리스트 축출기 - RandomListSelecter

이런 것 들을 모아 놨습니다. 누구든지 anonymous로 checkout 받으실 수 있습니다.
top

  1. 짱가 2007.04.13 14:26 PERM. MOD/DEL REPLY

    보고 있습니다~
    TDD 도우미는 어떻게 쓰는건가요? ^^

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.04.13 14:51 신고 PERM MOD/DEL

    넵~ :)
    TDD 도우미는 매우 단순한 ToDo 관리와 실제 작업한 시간을 측정하는데 사용할 수 있습니다.
    http://whiteship.tistory.com/502
    여기 있는 배포판은 그냥 bat 파일 실행하시면 됩니다.

  2. Green 2008.04.18 11:20 PERM. MOD/DEL REPLY

    정말 많은 도움이 될것 같습니다..감사합니다.^^

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.04.18 13:38 신고 PERM MOD/DEL

    우왕;; 제가 여기다가 정리해뒀었군요.
    캬캬 오래된 것들이라 spring 2.5 내용은 없을껍니다.

Write a comment.


Spring Framework 소스코드 CVS로 다운받기

Spring/Mission : 2006. 11. 24. 10:28


Spring 소스 SVN으로 다운받기를 시도해본 적이 있는데 오늘 갑자기 그 때 일이 다시 생각납니다. Spring 소스 코드를 CVS로 밖에 제공하지 않더군요. Eclipse에 SVN으로 checkout이나 commit은 종종 해봤지만 CVS는 해본적이 없어서 일단은 SVN repository와 같아 보이는 CVS repository를 열었습니다.

CVS+ 라는 아이콘을 클릭하고 소스코드가 있는 곳의 주소를 넣어줘야 될 것 같습니다.
위와 같이 입력하고 finish 를 하면 CVS repository에 다음과 같이 저장소가 하나 잡힌 것을 확인 할 수 있습니다. 아마도 Spring이겠죠. Spring을 체크아웃 받습니다.

이 안에 sample 코드도 많이 들어있고 spring 소스파일들은 src 폴더 안에 들어있습니다.

참고 : http://sourceforge.net/cvs/?group_id=73357

top

TAG CVS, Spring
  1. 독햏자 2011.09.26 13:54 PERM. MOD/DEL REPLY

    Spring Framework 소스를 다운받으려고 여기저기 찾아봤습니다만
    다들 비슷한 내용이신데 결정적으로 저 password를 모르겠더군요...
    password는 뭘 넣어야 하는지요?

Write a comment.


XmlBeanFactory 클래스 살펴보기

Spring/Mission : 2006. 11. 2. 10:53


package org.springframework.beans.factory.xml;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.io.Resource;

public class XmlBeanFactory extends DefaultListableBeanFactory {

   private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
  
   public XmlBeanFactory(Resource resource) throws BeansException {
       this(resource, null);
   }

   public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
       super(parentBeanFactory);
       this.reader.loadBeanDefinitions(resource);
   }

}

멤버 변수 하나.. 생성자 두개.. 매우 Simple한 클래스입니다. 상속 구조는 다음과 같습니다.

AbstractBeanFactory는 지난 번에 살펴본적이 있기 때문에 이 위로는 생략하였습니다. 그리고 꽤 많은 인터페이스들이 오른쪽에 얽혀 있는데 클래스의 상속 구조에만 집중하기 위해 짤랐습니다.

AbstractBeanFactory와 XmlBeanFactory사이의 두 개의 클래스에서 많은 인터페이스들을 구현해주고 있는 모습을 확인 할 수 있습니다.(물론 AbstractBeanFactory도  BeanfFactory, ConfigurableBeanFactory, HierarchicalBeanFactory 인터페이스를 구현했습니다.)











XmlBeanFactory의 생성자에서 호출하는 reader.loadBeanDefinitions(resource); 메소드를 보겠습니다.

public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
       return loadBeanDefinitions(new EncodedResource(resource));
}

loadBeanDefinitions() 소스코드 보기

EncodedResource.getResource() 메소드가 Xml configuration Metadata를 읽어 들이는 핵심 부분인듯 합니다.

메소드 호출 순서를 보겠습니다.
  1. new XmlBeanFactory( ~, ~)
    1. reader.loadBeanDefinitions(resource)
      1. Assert.notNull(encodedResource, "Message")
      2. logger.isInfoEnabled()
      3. logger.info("Message" + encodedResource.getResource())
      4. encodedResource.getResource().getInputStream()
      5. encodedResource.getEncoding()
      6. 위 5번의 반환값이 null이 아니면
      7. inputSource.setEncoding(encodedResource.getEncoding())
      8. return doLoadBeanDefinitions(inputSource, encodedResource.getResource()
      9. inputStream.close()
      10. 위 4번 부터 9번 사이에 IOException이 발생하면
      11. throw new BeanDefinitionStoreException("Message" + encodedResource.getResource(), ex)
top

Write a comment.


BeanFactory를 구현한 메소드 살펴보기

Spring/Mission : 2006. 10. 31. 17:45


먼저 BeanFactory에 있는 인터페이스를 지난번 글에 살펴보았습니다.

BeanFactory 인터페이스에 있는 책임(메소드)들을 구현 해 놓은 클래스는 AbstractBeanFactory 클래스 입니다.

이 클래스에서 구현한 public boolean containsBean(String name) 메소드안에서 호출되는 메소드를 보겠습니다.

자기 자신 factory 안에서 찾을 경우 입니다.
  1. containsLocalBean(name)
    1. transformedBeanName(String name)
    2. return containsSingleton(beanName) or containsBeanDefinition(beanName)
  2. return ture
자기 자신의 factory 안에서 찾지 못할 경우 입니다.(1-2.의 return값이 false일때)
  1. containsLocalBean(name)
  2. getParentBeanFactory()
  3. return parentBeanFactory.containsBean(originalBeanName(name))
    1. transformedBeanName(name)

public String[] getAliases(String name) 메소드
를 보겠습니다.
  1. transformedBeanName(name)
  2. new ArrayList()
  3. name.startsWith(FACTORY_BEAN_PREFIX)
  4. aliases.add(fullBeanName) -> fullBeanName 이 name과 같지 않을 때만 호출 됨
  5. this.aliasMap.entrySet().iterator() -> 루프를 돌기 위한 이터레이터 가져오기
  6. (Map.Entry) it.next()
  7. entry.getKey()
  8. aliases.add(key) -> key가 name하고 같지 않을 때만 호출 됨
  9. !containsSingleton(beanName) && !containsBeanDefinition(beanName)
  10. getParentBeanFactory()
  11. aliases.addAll(Arrays.asList(parentBeanFactory.getAliases(fullBeanName)))
  12. 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 메소드를 보겠습니다.
  1. public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException
    1. transformedBeanName(name)
    2. getSingleton(beanName)
      1. this.singletonCache.get(beanName)
    3. 위 2번에서 호출한 메소드로부터 반환된 값이 null 이 아니면
    4. isSingletonCurrentlyInCreation(beanName)
    5. logger.isDebugEnabled()
    6. logger.debug("~~~~~");
    7. containsBeanDefinition(beanName)
    8. 위 7번에서 호출한 메소드로부터 반환된 값이 true면
    9. getMergedBeanDefinition(beanName, false)
    10. getObjectForBeanInstance(sharedInstance, name, mergedBeanDefinition)
    11. 위 7번에서 호출한 메소드로부터 반환된 값이 false면
    12. getObjectForBeanInstance(sharedInstance, name, null)
    13. required Type이 있을 경우 그 타입과 얻어진 객체와의 타입을 비교하고 같지 않으면
    14. throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass())
    15. 13번에 걸리지 않으면
    16. return bean
위의 경우는 싱글톤 케시로 부터 빈을 가져오는 제일 간단한 경우였습니다. 그렇치 않은 경우는 매우 복잡하기에 다음에 알아보겠습니다.

public boolean isSingleton(String name) throws NoSuchBeanDefinitionException 메소드
를 보겠습니다.
  1. transformedBeanName(name)
  2. getSingleton(beanName) -> 반환 값을 beanInstance 변수에 대입.
  3. 위 2번에서 호출한 메소드로부터 반환된 값(beanInstance)이 null 이 아니면
  4. name이 FactoryDerefedence는 아니고 beanInstance가 FactoryBean이면
  5. BeanFactoryUtils.isFactoryDereference(name)
  6. return ((FactoryBean) beanInstance).isSingleton()
  7. 위 4번 조건에 해당하지 않으면
  8. return true
위의 경우는 싱글톤 객체를 찾았을 때의 제일 간단한 경우였습니다. 그렇치 않은 경우는상위 팩토리를 찾게 됩니다.

public Class getType(String name) throws NoSuchBeanDefinitionException 메소드를 보겠습니다.
  1. transformedBeanName(name)
  2. getSingleton(beanName)
  3. 위 2번에서 호출한 메소드로부터 반환된 값(beanInstance)이 null 이 아니면
  4. name이 FactoryDerefedence는 아니고 beanInstance가 FactoryBean이면
  5. return ((FactoryBean) beanInstance).getObjectType()
  6. 위 4번 조건에 해당하지 않으면
  7. return beanInstance.getClass()
위의 경우는 싱글톤 객체를 찾았을 때의 제일 간단한 경우였습니다. 그렇치 않은 경우는상위 팩토리를 찾게 됩니다.

top

Write a comment.


Object getBean(String name) 메소드 구현 살펴보기-중간 부분

Spring/Mission : 2006. 10. 30. 13:07


public Object getBean(String name) throws BeansException {
       return getBean(name, null, null);
}

위에서 보시다시피 getBean(String) 메소드에서 호출하는
public Object getBean(String name, Class requiredType, final Object[] args) throws BeansException
이 메소드의 중간 부분을 살펴 볼 차례입니다.(이 메소드의 윗부분은 전에 살펴 보았습니다.)

코드보기

이 부분을 크게 두 부분으로 나누어 볼 수 있겠습니다.

먼저 bean definiton을 찾는 부분(현재 factory에 없으면 부모 팩토리에서 찾는 부분)과 그 이후에 bean을 생성하는 부분입니다.

bean을 생성하는 부분은 다시 세 부분으로 나누어 볼 수 있겠습니다.
bean의 scope이 singleton 방식일 때 생성하는 부분 prototype일 때 생성하는 부분 그리고 그 이외의 scope일 때 bean을 생성하는 부분입니다.

bean difinition을 찾는 부분에서 결과물은 mergedBeanDefinition 변수 입니다. 이 변수를 만들기 위해 호출되는 getMergedBeanDefinition() 메소드를 살펴보겠습니다.

getMergedBeanDefinition() 메소드

checkMergedBeanDefinition() 메소드

bean을 생성하는 부분에서 사용되는 getObjectForBeanInstance() 메소드를 살펴보겠습니다.

getObjectForBeanInstance()메소드

spring 2.0에서는 singleton과 prototype이 외에 session을 비롯한 세개의 scope이 더 추가 되었는데요 그러한 부분이 마지막 else문에서 다뤄지고 있습니다. 그런데 prototype이라는 단어가 들어가는 메소드를 호출하는 부분이 많이 보이고 있으며.. 왜 if (mergedBeanDefinition.isSession())과 같은 코드가 보이지 않을까요?

spring 2.0 referecnce에서 bean scope에 관한 부분입니다. 이 부분을 좀 더 살펴봐야겠습니다.


top

Write a comment.


Object getBean(String name) 메소드 구현 살펴보기-윗 부분

Spring/Mission : 2006. 10. 27. 19:27


Object getBean(String name) throwsBeansException 메소드는 name에 해당하는bean의 객체를 반환합니다. 이 메소드는BeanFactory Singleton 또는Prototype 패턴을 사용하는 것을 보여줍니다. name으로 bean의 별명을 넘겨 줘도 그에 상응하는 bean 객체를 받아 볼수 있으며 이 경우에도 역시 해당하는 name이 없다면 상위BeanFactory에서 찾게 됩니다. 이 메소드는 특히RuntimeException을 발생 시킬 수 있는데 BeanException bean 객체를 가져오지 못했을 때 발생하며 BeanException의하위 클래스인 NoSuchBeanDefinitionException은 해당하는 name bean을 찾지 못했을 때 발생합니다.

먼저 소스코드를 보겠습니다.

public Object getBean(String name) throws BeansException {
       return getBean(name, null, null);
   }


아.. 다른 메소드를 호출 하고 있습니다. 혹시 getBean(String name, Class requiredType) 메소드도 이러한 모습을 하고 있지 않을까 예상됩니다.

public Object getBean(String name, Class requiredType) throws BeansException {
       return getBean(name, requiredType, null);
   }


역시 같은 모습을 하고 있었습니다.

이번 글에서는 두 개의 메소드 구현을 한꺼번에 살펴볼 수 있게 됐습니다. :) 이거양득?

먼저 세개의 아규먼트들이 무엇에 사용되는지 주석을 보겠습니다.

/**
    * Return the bean with the given name,
    * checking the parent bean factory if not found.
    * @param name the name of the bean to retrieve
    * @param requiredType the required type of the bean to retrieve
    * @param args arguments to use if creating a prototype using explicit arguments to a
    * static factory method. It is invalid to use a non-null args value in any other case.
    */

name과 class는 알겠는데 args 라는 final Object[] 타입이 무엇인지 잘 모르겠네요. 정적 팩토리 메소드를 사용해서prototype을 생성할 때 사용할 아규먼트들이라고 합니다.

Object getBean(String name, Class requiredType, final Object[] args) 메소드 보기


헉.... 깁니다....

메소드를 가장 밖에 있는 if 문을 기준으로 삼등분 시키겠습니다.



세 부분으로 나누니까 그래도 조금 안심이 되네요. 하지만 여전히 중간 부분이 굉장히 크네요. 먼저 제일 윗 부분 부터 살펴보겠습니다.

이 부분은 getSingleton(String) 메소드를 호출한 결과 값이 null이 아닐 경우에 실행되는 부분입니다. 그리고 크게 두 부분으로 나뉘어 지는데 첫번째 부분은 메소드 이름으로 추정해 보건데 싱글톤 객체가 현재 생성 중일 때 또는 그렇지 않을 때 logging 메시지를 처리하는 부분이라고 생각됩니다.

다음 부분은 실질적으로 빈을 생성하는 부분인듯 합니다. 빈 이름에 해당하는 빈 정의가 존재할 때와 그렇치 않을 때 각각 getObjectForBeanInstance()를 통해 bean을 받아 오고 있습니다.

이전에도 몇 번 본적이 있는 transformedBeanName(String) 메소드입니다.

Object sharedInstance = getSingleton(beanName); 여기서 호출되는 getSingleton(String)메소드 입니다. 이 메소드는 DefaultSingletonBeanRegistry 클래스에 있습니다. DefaultSingletonBeanRegistry 클래스와 AbstractBeanFactory와의 관계는 바로 다른 글에서 언급이 되었습니다. 짧게 D가 A의 아버지 입니다.

logging 관련 부분은 나중에 살펴보도록 하고 getMergedBeanDefinition(String, boolean) 메소드를 보겠습니다.

마지막으로 getObjectForBeanInstance(Object, String,  RootBeanDifinition) 메소드를 살펴보겠습니다.

getObjectForBeanInstance 메소드는 좀 더 자세히 살펴 봐야겠습니다.

top

Write a comment.


BeanFactory와 AbstractBeanFactory의 관계

Spring/Mission : 2006. 10. 26. 15:57



AbstractBeanFactory는 총 네 개의 인터페이스 구현에 대한 책임이 있지만 abstract class인 관계로 몇몇 메소드는 abstract인 채로 하위 클래스에서 구현하도록 되있습니다.

그리고 네 개의 인터페이스 중에 하나 인 SingletonBeanRegistry 인터페이스는 DefaultSingletonBeanRegistry 클래스에서 구현을 했고 이 클래스를 상속 받고 있는 구조입니다.

UML에 차마 다 그리기가 힘들어서 ConfigurableBeanFactory의 메소드들과 AbstractBeanFactory의 필드와 메소드들을 비워놨습니다.

현재 BeanFactory 인터페이스, HierachicalBeanFactory 인터페이스, SingletonBeanRegistry 인터페이스 만 모두 표현해 둔 상태입니다.

mission1의 문제는 Xml을 읽어들여 BeanFactory가 작동하는 방식을 규명하는 것인데..

결국 XmlBeanFactoy까지 내려 가야 할텐데 지금은 AbstractBeanFactory에서 BeanFactory 인터페이스의 책임들을 어떻게 구현해 두었는지 살펴보고 있습니다.


ps : getBean 메소드 무지 길어요. 이거 리팩토링 해야되는거 아니에요? ^^


top

Write a comment.


String[] getAliases(String name) 메소드 구현 살펴보기

Spring/Mission : 2006. 10. 26. 12:37


BeanFactory 인터페이스에 있는 메소드들을 어떻게 구현했나 살펴보고 있습니다.


if (!fullBeanName.equals(name)) {
           aliases.add(fullBeanName);
       }
저는 이부분이 이해가 잘 안가네요.

name은 매개변수로 받아온 이름이고 만약에 그 name이 &로 시작을 하면 fullBeanName은 transformedBeanName(String) 메소드 호출하여 반환 된 값을 참조하는 beanName에 &를 붙인 값이 됩니다.

그런데 transformedBeanName(String) 메소드는 아래에 보시다시피 &로 시작하는 name이 오면 맨 앞에 &를 제외한 상태로 문자열을 반환하게 됩니다.

transformedBeanName(String) 메소드


그렇게 때문에 if (!fullBeanName.equals(name)) 여기서 어떻게 name하고 fullName하고 달라질 수가 있는지.. 모르겠네요.

이 메소드에서 호출되는 다른 메소드 들도 containsBean(String) 메소드에서 확인바 있습니다.


ps : 이 메소드에서도 역시 제가 아직 풀지 못한 수수께끼.. FACTORY_BEAN_PREFIX  이 변수와 관련해서 name으로 받아온 String의 제일 앞 글자가 &로 시작하면 무슨일이 벌어지는 걸까요...


top

Write a comment.


boolean containsBean(String name) 메소드 구현 살펴보기.

Spring/Mission : 2006. 10. 26. 11:52


BeanFactory 인터페이스에 있는 메소드의 구현을 살펴보겠습니다.

String[] getAliases(String name) 메소드는 name으로 참조 되는 bean의 다른 이름들 즉 별명들을 String 배열로 반환하는 메소드 입니다. name으로 넘겨진 값이별명 중에 하나였다면 그에 상응하는 bean의 원래 name과별명들을 같이 반환합니다. 이때 원래 name은 배열의 제일처음에 위치합니다. 이 메소드 또한 현재 BeanFactory에서해당하는 bean을 찾지 못한다면 부모 BeanFactory에서찾게 됩니다.

Best 시나리오 일때는 자기 자신의 favtory안에서 String type의 매개변수에 해당하는 bean을 찾을 겨우 입니다. 이때는 다음과 같은 메소드 호출 Stack으로 파악할 수 있습니다.


AbstractBeanFactory에 구현된 boolean containsBean(String)


containsLocalBean(String) 메소드


containsSingleton(String) 메소드 와 containsBeanDefinition(String) 메소드


자기 자시의 BeanFactory에서 찾지 못할 때는 부모 BeanFactory에서 찾게 됩니다. 아래는 그림은 containsBean 메소드의 구조를 도식화 한것입니다.


containsBean 메소드에 넘어온 매개변수를 originalBeanName 메소드의 인자로 전해주고(파란선) 그 결과 값을 다시 parentBeanFacory.containsBean(String) 메소드의 인자로 넘겨줍니다.(빨간선)
parentBeanFactory.containsBean(String) 이부분을 Stack 구조로 나타내면 다음과 같습니다.


getParentBeanFactory() 메소드


originalBeanName(String) 메소드


AbstractBeanFactory transformedBeanName(String) 메소드와BeanFactoryUtils에 있는 transformedBeanName(String) 메소드




ps : BeanFactory 인터페이스를 구현한 AstractBeanFactory에 있는 method들을 살펴보았습니다.
앞서 궁금해 했던 BeanFactory.FACTORY_BEAN_PREFIX 이 필드를 사용하는 것을 볼 수 있는데요. &를 생성하고자 하는 Bean name앞에 붙여서 getBean을 하게 되면 어떻게 되는건지 해봐야겠네요.

ps : 오타가 많은 듯 한데 찾기가 쉽지 않군요. ㅎㅎ;;;

top

  1. Favicon of https://springframework.tistory.com BlogIcon 영회 2006.10.26 00:44 신고 PERM. MOD/DEL REPLY

    조금 간결해졌으면 좋겠고.. ^^
    어떤 흐름으로 메소드가 호출되는지 볼 수 있으면 더 좋겠구나.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.26 08:38 신고 PERM MOD/DEL

    네~ Simple.. and Visual

Write a comment.


BeanFactory 인터페이스 살펴보기

Spring/Mission : 2006. 10. 25. 14:03


먼저 org.springframework.beans.factory.BeanFactory가 책임지는 것은 무엇들이 있는지 살펴 보겠습니다.

BeanFactoryAPI를 살펴보겠습니다. 일반적으로BeanFactory XML 같은configuration data 안에 저장된 Bean에 대한 정의들을 읽어 들이고, org.springframwork.beans 패키지를 사용하여 Bean을설정합니다.

BeanFactory 인터페이스가 가지고 있는 필드 입니다.

Field Summary

static String

FACTORY_BEAN_PREFIX
         Used to dereference a FactoryBean and distinguish it from beans created by the FactoryBean.


BeanFactory 인터페이스 안에 들어있는 메소드들은 다음과 같습니다.

Method Summary

boolean

containsBean(String name)
         Does this bean factory contain a bean definition with the given name?

String[]

getAliases(String name)
         Return the aliases for the given bean name, if defined.

Object

getBean(String name)
         Return an instance, which may be shared or independent, of the given bean name.

Object

getBean(String name, Class requiredType)
         Return an instance (possibly shared or independent) of the given bean name.

Class

getType(String name)
         Determine the type of the bean with the given name.

boolean

isSingleton(String name)
         Is this bean a singleton?


메소드들은 대강 어떤 일을 책임을 지고 있는지 알겠는데 맨 위에 있는 필드 하나가 잘 모르겠네요.

org.springframework.beans.factory.BeanFactory
public static final StringFACTORY_BEAN_PREFIX"&"

Used to dereference a FactoryBean and distinguish it from beans created by the FactoryBean. For example, if the bean named myEjb is a FactoryBean, getting &myEjb will return the factory, not the instance returned by the factory.

dereference라는 단어는 처음보네요 ^^;; reference는 수도없이 봐왔는데. FactoryBean과 FactoryBean에 의해 생성된 bean을 구분하기 위해 사용한다고 하는군요. 예를 든 것을 보면 빈 이름이 myEjb이면 FactoryBean이고 &myEjb는 factory에 의해 반환되는 객체가 아니라 factory를 반환한다.

지쟈스... 무슨 말인지... Someboby PLZ HELP~
top

Write a comment.


Spring Framework 소스코드 SVN으로 다운 받기(불가능)

Spring/Mission : 2006. 10. 25. 10:42


먼저 https://svn.sourceforge.net/svnroot/springframework 이 주소를 이클립스에서 svn 저장소에 추가 시켜 줍니다.

오픈소스들은 전부 이런식으로 소스코드를 다운 받을 수 있다고 합니다.

svn 저장소에 다음과 같이 주소가 추가 된 것을 확인 할 수 있습니다.


그리고 열어 봤더니...


대체 저 중에 뭘 다운 받아야 한단 말인지... 순간 당황했습니다.

역시 찍기 솜씨를 발휘하여.. 적당해 보이는 것을 클릭하고 체크아웃! 결과는 추후에.. 일단 해보는겁니다. ㅋ

.................................추가 부분........................

Looking for the Source Code?

The source code for the core Spring project is available through anonymous CVS at SourceForge's CVS Server.

  • Use CVS HEAD for the current Spring 2.x development stream.
  • Use the CVS branch named "mbranch-1-2" for the Spring 1.2.x maintenance stream.

Thesource code for Spring Web Flow, Spring Web Services, Spring-LDAP, andSpring-OSGi is available through anonymous SVN at SourceForge's Subversion Server.


아 ... 이런!!!!!!!!

Spring 소스코드는 cvs 저장소에서 다운이 가능하고 Spring Web Flow랑 Web Services, LDAP, OSGI가 svn 저장소에서 체크아웃 가능하군요.

제목 부터가 틀렸네요.
top

  1. Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.25 10:56 신고 PERM. MOD/DEL REPLY

    앗.. 저 폴더가 아니였습니다. jar파일들만 있더군요.

    일단은 spring framewrk 2.0 압축 푼 폴더 전체를 이클립스에 프로젝트로 불러들였습니다. 에효~ OTL

    Favicon of http://oseb.tistory.com BlogIcon oseb 2006.10.25 11:09 신고 PERM MOD/DEL

    뭔지 모르지만 svn 내용을 보니 spring-projects 같은데요.
    spring-projects/trunk 입니다.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.25 12:23 신고 PERM MOD/DEL

    앗 감사합니다. :) 확인해보고 글을 수정해야겠군요.

  2. Favicon of https://springframework.tistory.com BlogIcon 영회 2006.10.25 14:07 신고 PERM. MOD/DEL REPLY

    spring-projects는 spring framework를 말하는 것이 아닙니다.

    그리고, http://www.springframework.org/development 를 차분히 읽어보길... ㅡㅡ;

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.25 14:06 신고 PERM MOD/DEL

    넵...ㅠㅠ;;;

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.25 14:12 신고 PERM MOD/DEL

    영회형 ~~~를 이렇게 링크가 붙어서 페이지를 못찾길래 수정했더니..

    이름이 바껴버렸네요.. 허헐;;

    Favicon of https://springframework.tistory.com BlogIcon 영회 2006.10.25 17:36 신고 PERM MOD/DEL

    남의 글은 수정하지 않는 법이지.. ㅡㅡ;

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.10.25 23:37 신고 PERM MOD/DEL

    죄송합니다.(__)

Write a comment.