작성
·
206
·
수정됨
0
1.프로토타입 스코프 11분 28초에 preDestory같은 메소드가 실행되지 않는다고 했는데요.ac.close(); 이건 preDestory가 아닌가요?
2.프로토타입 스코프 11분 28초싱글톤 빈은 하나의 빈으로 종료까지 관여 하는거고 프로토타입스코프는 여러개의 빈이 생성되고 초기화까지만 관여하는걸로 이해해 도 되나요?
3.프로토타입 스코프 10분 강의 똑같이 따라 쳤는데 아래와 같은 에러가나옵니다. 뭐가 문제인건가요?
package hello.core.scope;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class PrototypeTest {
@Test
void prototypeBeanFind(){
AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(PrototypeBean.class);
PrototypeBean prototypeBean1=ac.getBean(PrototypeBean.class);
PrototypeBean prototypeBean2=ac.getBean(PrototypeBean.class);
System.out.println("prototypeBean2 = " + prototypeBean2);
System.out.println("prototypeBean1 = " + prototypeBean1);
Assertions.assertThat(prototypeBean2).isNotSameAs(prototypeBean1);//똑같은 인스턴스가 출력됨.
ac.close();
}
@Scope("Prototype")
static class PrototypeBean{
@PostConstruct
public void init(){
System.out.println("Prototype.init");
}
@PreDestroy
public void destory(){
System.out.println("Prototype.destory");
}
}
}
java.lang.IllegalStateException: No Scope registered for scope name 'Prototype'
이런에러가 나오는데 뭐가문제인가요?
4.파란색선인 프로토타입이닛보다 빨간색프로토타입 빈2가 더빨리 나와야 하는거 아닌가요?println이 더 먼저 있는데요.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
ac.close();
명령어는 스프링 컨테이너를 종료하는 명령어입니다. 프로토타입 스코프의 경우, 스프링 컨테이너는 빈의 생성과 초기화 (init
)까지만 관여하고, 이후 소멸 과정은 관여하지 않기 때문에 @PreDestroy
와 같은 소멸 메서드는 실행되지 않습니다.
맞습니다. 싱글톤 스코프의 빈은 스프링 컨테이너에 의해 생성, 초기화, 관리, 그리고 종료까지 책임집니다. 반면에 프로토타입 스코프의 빈은 스프링 컨테이너가 생성과 초기화만 수행하며, 그 이후에는 컨테이너가 빈을 관리하지 않습니다. 따라서 프로토타입 스코프의 빈에 대한 생명주기는 개발자가 직접 관리해야 합니다.
에러 메시지와 함께 제시된 코드를 보면, @Scope
애노테이션의 값에 오타가 있습니다. 'Prototype'
이 아니라 'prototype'
이라고 소문자로 작성해야 합니다. 정확한 사용법은 @Scope("prototype")
이렇게 소문자로 명시하는 것입니다.
관련된 이미지 확인이 불가능하므로 정확한 답변을 드리기 어렵습니다. 하지만 일반적으로 println
명령어가 먼저 있어도 실제 출력 순서는 JVM이나 시스템의 상황에 따라 달라질 수 있습니다. 코드 실행 중 스레드 스케줄링이나 기타 요인으로 실행 순서가 바뀔 수 있기 때문입니다.
도움이 되셨기를 바랍니다, ekek님. 추가적인 질문이 있으시다면 언제든지 질문해주세요!