노트
- 면접 보다가 스프링의 IoC/DI 핵심기술과 관련해 꼬리질문을 받다가.. 왜 여기까진 생각해보지 못했을까 회고하며 정리해보자.
- 일반적으로 익히 다들 다 알고 있듯이 스프링 컨테이너는 Bean을 등록받고 이를 필요로 하는 클래스에 주입 해준다.
- 크게 Bean을 주입 받는 방법으로 생성자로 주입받는 방식과 필드에 주입받는 방식 두가지로 나뉜다.
- 이 중 필드에 주입 받는 방식의 경우 @Autowired 라는 어노테이션을 명시하여 주입받도록 한다.
- @Autowired 어노테이션으로 명시된 필드에 대해 어떻게 인스턴스를 주입하는 것일까?
- 바로 리플렉션(Reflection)을 사용해 주입한다.
- 어노테이션을 생성하게 되면 다음과 같이 생성할 수 있다. 스프링의 @Autowired 어노테이션을 예로 들어보자
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowired { /** * Declares whether the annotated dependency is required. * <p>Defaults to {@code true}. */ boolean required() default true; }
RetentionPolicy.RUNTIME
정책으로 변경하게되면, 런타임내에서도 어노테이션 정보를 참조할 수 있게 된다.Class<?> fooClass = Class.forName("com.example.service"); Constructor<?> constructor = fooClass.getConstructor(null); Object instance = constructor.newInstance();
Class.forName("com.example.service").getAnnotations()
요약
요약: 리플렉션