스프링의 의존성 주입 어떻게 동작하는지 알아보자
- 어떻게 스프링은 어노테이션만으로 자동으로 의존성을 주입해줄 수 있는걸까?
- 어떻게 저 변수값들이 null이 아닌걸까?
리플렉션은 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 API이다.
여기서 로드된 클래스라고 함은, JVM의 클래스 로더에서 클래스 파일에 대한 로딩을 완료한 후, 해당 클래스의 정보를 담은 Class 타입의 객체를 생성하여 메모리의 힙 영역에 저장해 둔 것을 의미한다. new 키워드를 통해 만드는 객체와는 다른 것임을 유의하자
자바는 컴파일시점에 타입을 결정하는 정적인언어야
컴파일시점에 그 타입에 대한 정보를 다 알고있어야해.
근데 object obj = new Car(); 와 같이 선언하고 obj에 대해 접근하면 컴파일에러가 나
컴파일 시점에 그 타입에 대한 정보를 다 알고 있지 않아서. obj는 object에 대한 변수, 메서드만 갖고있어서
오류가 나
근데 리플렉션을 사용하면 저상황에서도, 즉, 구체적인 타입은 몰라도 car클래스의 변수나 메서드에 접근할 수 있어
class파일을 가지고 분석해서 얻어내거든
test코드에 BookService, BookRepository를 만들고 자바폴더쪽의 코드에는 ContainerService를 만든다
ContainerService : class객체를 받아서 그 객체의 타입을 return
BookService, BookRepository: 예제 클래스들 service쪽에서 Inject어노테이션을 사용해 BookRepository를 주입받는다
ContainerService로 class객체를 넘겨준다
넘어온 클래스 객체의 필드 중 Inject어노테이션이 붙은 필드가 있는지 검사한다
만약 있다면 해당 필드에 대한 instance를 만든다음에 필드에 setting해준다
그리고 setting까지 완료해준 class객체에 대한 인스턴스를 return한다
https://github.com/Flre-fly/theJavaReflection.git
출처
https://steady-coding.tistory.com/609
https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/ < 여기 좋다