singleton 패턴에 대해서는 아래 참고 포스팅을 참고 바란다.
spring 에서의 기능중 하나는 의존성 주입인 DI 가 있다.
자세한 내용은 아래 참고 포스팅 참고바란다.
스프링에서는 컨테이너 위에 Bean이라고 하는 객체들을 생성한다.
그럼 개발자가 아닌 스프링에서 Bean을 대신해서 관리를 해준다.
여기서 Bean은 스프링위에 생성이 되는데,
호출이 될때마다 생성이 되는것이 아닌.
Bean은 하나만 생성해두고, 호출이 될때마다 그 객체를 가져다 쓴다.
여러번 호출이 된다고 해서 객체가 여러개 생기는게 아니고 , 이것이 싱글톤이다.
간단히 코드로 예제를 살펴보면.
@RestController @RequiredArgsConstructor public class TestController { private final TestService service; private final TestService service2; @PostMapping("/api") public String justApi(@RequestBody TestInDto inDto) { System.out.println(System.identityHashCode(service)); System.out.println(System.identityHashCode(service2)); ....이하 생략 |
일단 TestService역시 Bean으로 등록되어있고,
TestController에서 해당 테스트 서비스를 service 와 service2라는 이름으로 두번 호출이 되었다.
그럼 여기서 주소위치를 호출하는 identityHashCode를 출력하면 어떻게 나올까?(참고 포스팅 참고)
필자의 피시에서 출력은 아래와 같았다.
912946384
912946384
즉 동일한 메모리의 위치를 참조하고 있다.
한가지 테스트를 더 해보면
Service안에
private int cnt=0; public int getCnt() { return this.cnt; } public int addCnt() { cnt= this.cnt+1; return cnt; } |
이라는 코드를 추가 후
다시 TestController 에서
System.out.println(service.getCnt()); service.addCnt(); System.out.println(service2.getCnt()); |
를 할 경우 출력은
0, 1 이 순서대로 나온다.
분명 service에 addCnt를 해줬지만 동일 주소를 참조하는 service2에도 값이 증가된것을 확인할 수 있다.
참고 포스팅
https://thenicesj.tistory.com/146
https://thenicesj.tistory.com/144
https://thenicesj.tistory.com/599
'IT > Java' 카테고리의 다른 글
Spring DL 이란?(Dependency Lookup) (69) | 2023.07.30 |
---|---|
Spring prototype Bean (53) | 2023.07.29 |
Queue (LinkedList) 사용법 (63) | 2023.07.26 |
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed (82) | 2023.07.23 |
의존관계 주입시 Bean이 없을때 (63) | 2023.07.22 |
댓글