///////
Search
🦠

(Field 주입과 대비하여) 생성자 주입은 빈 생성 때 사용되는 리플랙션 외에 추가적인 리플랙션을 진행하나요?

리플랙션

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API
컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출해낼 수 있는 프로그램 기법
다양한 곳에 사용된다
스프링 - DI에 사용
MVC - View에서 넘어오는 데이터를 객체에 바인딩할 때 사용
Hibernate - @Entity 클래스에 setter가 없으면 해당 필드에 값을 바로 주입
JUnit - ReflectionUtils 라는 클래스를 내부적으로 정의하여 사용
단점
느리다
Reflection API는 컴파일 시점이 아니라 런타임 시점에서 클래스를 분석한다.
JVM을 최적화할 수 없기 때문에 성능저하 발생
런타임 시점에 클래스 정보를 알게 됨
컴파일 시점에서 타입체크 기능을 사용할 수 없음
에러 발생할 확률이 높아진다
추상화 파괴, 불변성 파괴
접근할 수 없는 필드나 메서드에도 reflection을 통해 접근할 수 있고 모든 클래스의 정보를 알게 된다.

필드 주입과 생성자 주입

Field Injection은 Bean이 생성된 이후 AutowiredAnnotationBeanPostProcessor의 processInjection() 메서드를 통해서 주입하게 된다.
생성자 주입은 field 주입과 다르게 빈 생성 때 사용되는 리플랙션 외에 추가적인 리플랙션을 사용하지 않는다