인프런 커뮤니티 질문&답변

박진우님의 프로필 이미지
박진우

작성한 질문수

스프링 핵심 원리 - 기본편

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

타입이 아닌 "prototypeBean" 이름으로 빈 조회시 에러

작성

·

229

0

@Test
void prototypeFind() {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);
    

    PrototypeBean prototypeBean1 = ac.getBean("prototypeBean", PrototypeBean.class);
    prototypeBean1.addCount();
    Assertions.assertThat(prototypeBean1.getCount()).isEqualTo(1);

    PrototypeBean prototypeBean2 = ac.getBean("prototypeBean", PrototypeBean.class);
    prototypeBean2.addCount();
    Assertions.assertThat(prototypeBean2.getCount()).isEqualTo(1);
}

@Scope("prototype")
static class PrototypeBean {
    private int count = 0;
...
}

강의에서는 PrototypeBean.class만 사용하여 타입으로 조회를 했습니다.
PrototypeBean 클래스가 컴포넌트스캔되므로, 해당 클래스의 이름은 PrototypeBean을 이름으로 넣어서 조회했으나

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'prototypeBean' available

빈을 찾을수 없다고 합니다. prototypeBean으로 첫 글자를 소문자로 변경하여도 동일합니다.

해당 클래스의 객체가 빈으로 등록될 때 빈 이름을 지정하는 방식을 제가 잘못 이해하고 있는건지, 이름으로 조회를 하고싶은데 어떻게 히면 좋을지 궁금합니다.

 

답변 2

2

안녕하세요. 박진우님, 공식 서포터즈 David입니다.

PrototypeBean 클래스는 내부 클래스입니다.

내부 클래스를 빈으로 등록하는 경우 내부 클래스를 감싸고 있는 클래스의 이름을 포함하여 빈의 이름을 지정하게 됩니다.

예) Foo 클래스, Bar 클래스가 있고, Bar는 Foo 내부에 위치하는 내부클래스일 때, Bar를 빈으로 등록하면 foo.Bar로 이름이 등록됩니다.

이를 참고하셔서 빈 이름을 적절하게 변경하신 뒤 다시 시도해보세요🙂

감사합니다.

0

컴파일을 할때 소스코드를 jvm이 읽을수있는 바이트코드로 바꿔서(=.java형태인 코드를 .class로) class loader에 의해 등록이 되는데 @bean은 IOC법칙에 의해 주체가 내가아닌 스프링에게 권한이 위임되고 저장되는 위치는 heap영역에 저장되다보니 method area와 같이 인스턴스를 공유할수있게됩니다.

prototype.class가 아닌 prototype로 검색을했을때 컴파일에 xxx.class로 올라가있기때문에 인식하지못하고 bean을 찾을수없다고하는거같습니다

제 개인적인생각이어서 멘토분이 나타나셔서 대답해주실거같습니다. 저도 배운내용이라 한번 적어봤습니다

박진우님의 프로필 이미지
박진우

작성한 질문수

질문하기