BeanFactory에 등록된 bean들은 scope가 있다.
기본 Scope : Singleton Scope
Singleton Scope 이란?
해당 인스턴스가 하나뿐이다. 같은 인스턴스를 재사용하는 것이다.
기본적으론 생성된 bean은 SingletonScope이라 같은 인스턴스을 바라본다.
@Scope("prototype”)를 설정하면 매번 다른 인스턴스를 생성할 수 있다.
@Scope(“prototype”)차이점 보기
1.Single Class는 기본 Singleton 스코프
2.Proto Class는 prototype스코프로 선언
출력해보면 결과가 다르게 나온다.
@Component
public class Single {
@Autowired
Proto proto;
public Proto getProto() {
return proto;
}
}
@Component @Scope("prototype")
public class Proto {
}
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("single");
System.out.println(context.getBean(Single.class));
System.out.println(context.getBean("single"));
System.out.println(single);
System.out.println("poroto");
System.out.println(context.getBean(Proto.class));
System.out.println("----");
System.out.println(context.getBean("proto"));
System.out.println("---");
System.out.println("single.getProto().getClass() : 1----");
System.out.println(context.getBean(single.getProto().getClass()));
System.out.println("single.getProto().getClass() : 2----");
System.out.println(context.getBean(single.getProto().getClass()));
System.out.println("----같은 인스턴스 보는 이슈");
System.out.println(context.getBean(Single.class).getProto());
System.out.println(context.getBean(Single.class).getProto());
}
single
com.choi.scope.Single@4b6e1c0
com.choi.scope.Single@4b6e1c0
com.choi.scope.Single@4b6e1c0
poroto
Proto 인스턴스 생성
com.choi.scope.Proto@26cb5207
----
Proto 인스턴스 생성
com.choi.scope.Proto@15400fff
---
single.getProto().getClass() : 1----
Proto 인스턴스 생성
com.choi.scope.Proto@18d910b3
single.getProto().getClass() : 2----
Proto 인스턴스 생성
com.choi.scope.Proto@1e7ab390
----같은 인스턴스 보는 이슈
com.choi.scope.Proto@11d4dbd6
com.choi.scope.Proto@11d4dbd6
ProtoType에서 Singleton을 Autowired 하면 큰 문제없다.
하지만 Singleton에서 Prototype을 Autowried 한다면?
계속 같은 주소를 불러오는 이슈가 있다.
이때는 @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
설정으로 프록시로 감싸서 사용하면 된다.
@Component @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Proto {
@PostConstruct
public void main(){
System.out.println("Test");
System.out.println("생성자 주입");
System.out.println("Proto 인스턴스 생성");
}
}
single
com.choi.scope.Single@2f897dab
com.choi.scope.Single@2f897dab
com.choi.scope.Single@2f897dab
poroto
Proto 인스턴스 생성
com.choi.scope.Proto@39a87e72
----
Proto 인스턴스 생성
com.choi.scope.Proto@5d2828c9
---
single.getProto().getClass() : 1----
Proto 인스턴스 생성
com.choi.scope.Proto@3a082ff4
single.getProto().getClass() : 2----
Proto 인스턴스 생성
com.choi.scope.Proto@45acdd11
----같은 인스턴스 보는 이슈 해결
Proto 인스턴스 생성
com.choi.scope.Proto@3f0d6038
Proto 인스턴스 생성
com.choi.scope.Proto@237f7970
DB 연결을 자주 수정해야 할 때가 있다면 유용하게 사용할 수 있을 것 같다.
보통 Singletion은 생명주기가 길다. 여러 스레드에서 참조하는 경우 값이 계속바뀔수 있기에 prototype으로 생성하는것이 좋을거 같다.
'개발 소발 > 개발 Spring' 카테고리의 다른 글
Spring DispatcherServlet 기초개념 (0) | 2020.08.06 |
---|---|
Spring Environment 기초 사용방법 (0) | 2020.07.13 |
Spring Autowired와 ComponentScan이란 (0) | 2020.07.10 |
AOP란? AOP 기초개념 (0) | 2020.07.09 |
Spring IoC(Inversion of Control),Bean,의존성주입이란? (0) | 2020.07.08 |