Whiteship's Note

Spring에서 Bean을 언제 만들지?

Spring/Chapter 3 : 2007.06.05 18:34


그때 그때 상황(Context, Configuration Metadata)에 따라 다릅니다.
 
0. default로 BeanFactory와[각주:1] ApplicationContext를 만들 때 모든 bean들의 객체를 만들어 두고 getBean()이라는 요청이 오면 해당 bean을 넘겨 줍니다.

1. 만약에 어떤 bean을 미리 만들어 두기 싫고 필요할 때 만들고 싶다면(lazy-initialization) lazy-init 속성을 사용할 수 있습니다.

2. bean의 scope와도 관계가 있는데요. bean을 정의할 때 별다른 설정을 하지 않으면 singleton scope을 가지게 됩니다. 이 때도 역시 bean을 미리 만들어 둘려고 합니다. singleton이 아닌 scope으로 설정하면 미리 만들어 두지 않습니다.

3. 1번과 2번으로 해당 bean을 설정해도 예상과 다르게 동작할 수 있습니다. scope이나 lazy-init 속성이 다른 여러 bean들 사이의 종속성으로 인해 그런 일이 발생합니다.

0, 1, 2를 표로 나타내면 다음과 같습니다.

bean설정 내용

Singleton(Default)

Non-Singleton

Lazy-Init=false(default)

초기에 생성

나중에 생성

Lazy-Init=true

나중에 생성

나중에 생성


테스트 코드
 public void testBeanInstantiation() throws Exception {
  System.out.println("*******************************");
  System.out.println("BeanFactory 만들기 시작!!!");
  System.out.println("*******************************");
  Resource resource = new ClassPathResource("bean/beanInstantiation-context.xml");
  BeanFactory beanFactory = new XmlBeanFactory(resource);
  assertNotNull(beanFactory);
  System.out.println("*******************************");
  System.out.println("BeanFactory 만들기 끝!!!");
  System.out.println("*******************************");
  Object bean1 = beanFactory.getBean("bean1");
  System.out.println("*******************************");
  System.out.println("bean1 만들기 끝!!!");
  System.out.println("*******************************");
  bean1 = beanFactory.getBean("bean1");
  System.out.println("*******************************");
  System.out.println("bean1 만들기 끝!!!");
  System.out.println("*******************************");
 }

예상[각주:2]했던 거랑은 달리 ApplicationContext랑 BeanFactory 차이가 없습니다.[각주:3]

테스트 할 때 사용한 파일들 입니다.


  1. 김재호님의 제보로 수정합니다. BeanFactory는 무조건 Lazy Initialization을 사용합니다. [본문으로]
  2. BeanFactory에서만 prototype일 경우 lazy-init을 무시한다. [본문으로]
  3. 그러나 테스트 해본 결과 ApplicationContext도 prototype일 경우 lazy-init을 무시합니다. [본문으로]

'Spring > Chapter 3' 카테고리의 다른 글

3.10.3. @PostConstruct and @PreDestroy  (0) 2007.07.30
3.10.2. @Resource  (0) 2007.07.30
3.10.1. @Autowired  (0) 2007.07.30
3.10. Annotation-based configuration  (0) 2007.07.30
Bean Life Cycle  (2) 2007.06.21
Spring에서 Bean을 언제 만들지?  (5) 2007.06.05
Spring Reference 3장 오타  (2) 2007.05.22
Bean Life Cycle 콜백 인터페이스 사용 예(in Spring)  (2) 2007.05.11
머리 뽀개지는 BeanPostProcessor  (0) 2007.05.09
Bean Life Cycle 통째로 테스트  (0) 2007.05.09
BeanFactoryAware 테스트  (0) 2007.05.09
top

  1. 김재호 2007.12.13 00:31 PERM. MOD/DEL REPLY

    BeanFactory에서 lazy-init 속성은 무시 되는거 아닌가요?
    BeanFactory는 컨테이너 생성 시점에서 bean들을 생성안하고 요청했을때 만드는데
    ApplicationContext 처럼 BeanFactory도 bean을 미리 만들어 두는 방법이 있는 건가요?

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

    BeanFactory에서 lazy-init 속성은 무시 되는거 아닌가요?
    => bean의 scope와 의존성에 따라 다른 결과가 발생합니다.

    BeanFactory는 컨테이너 생성 시점에서 bean들을 생성안하고 요청했을때 만드는데
    => 꼭 그렇치는 않습니다. bean 설정에 따라 다릅니다.

    ApplicationContext 처럼 BeanFactory도 bean을 미리 만들어 두는 방법이 있는 건가요?
    => 아직까진 모르겠습니다.

  2. 김재호 2007.12.13 15:18 PERM. MOD/DEL REPLY

    그렇다면 제가 그동안 잘못 알고 있었군요...

    BeanFactory 를 생성 할 때 다음과 같은 bean이 선언 되어 있을 경우
    <bean id="test" class="a.Test" />
    scope는 디폴트로 singleton인데 왜 미리 생성을 안하는지 궁금하네요
    어떻게 설정해야 하는지 알려 주실 수 있으신가요?

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

    죄송합니다. 제가 틀렸습니다. ㅎㅎ;;
    BeanFactory는 lazy initialization만 제공합니다.
    글을 수정하겠습니다~ 감사합니다.(__)/

  3. 김재호 2007.12.13 17:38 PERM. MOD/DEL REPLY

    아닙니다.
    BeanFactory는 lazy initialization만 제공하는걸 확실히 알았으니 오히려 제가 감사합니다.

Write a comment.




: 1 : ··· : 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15 : 16 : ··· : 58 :