작성
·
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
0
컴파일을 할때 소스코드를 jvm이 읽을수있는 바이트코드로 바꿔서(=.java형태인 코드를 .class로) class loader에 의해 등록이 되는데 @bean은 IOC법칙에 의해 주체가 내가아닌 스프링에게 권한이 위임되고 저장되는 위치는 heap영역에 저장되다보니 method area와 같이 인스턴스를 공유할수있게됩니다.
prototype.class가 아닌 prototype로 검색을했을때 컴파일에 xxx.class로 올라가있기때문에 인식하지못하고 bean을 찾을수없다고하는거같습니다
제 개인적인생각이어서 멘토분이 나타나셔서 대답해주실거같습니다. 저도 배운내용이라 한번 적어봤습니다