
1.자바에서 어노테이션 만들기
@Target으로 적용할위치
@Retention으로 유효 범위
@interface로 어노테이션만들기
@String value()로 추상메서드로 키값(매개변수)만들기
package ex02; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD)//어노테이션을 적용할 위치 (메서드에 적용) @Retention(RetentionPolicy.RUNTIME) // 어노테이션의 유효 범위 (런타임까지 유지) public @interface RequestMapping { String uri(); // 어노테이션의 요소 //String value(); // 요소 이름을 value로 설정하면 키없이 값을 넣을 수 있다. }
2.어노테이션 적용하기
위에코드에 설정한대로 메소드위에다가 어노테이션 적용한 모습
package ex02; public class UserController { @RequestMapping(uri = "/save-form") public void saveForm(){ System.out.println("save-form 호출됨"); } @RequestMapping(uri = "/login") public void login(){ System.out.println("login 호출됨"); } @RequestMapping(uri = "/join") public void join(){ System.out.println("join 호출됨"); } @RequestMapping(uri = "/userinfo") public void userinfo(){ System.out.println("userinfo 호출함"); } }
3.리플렉션을 통하여 어노테이션 찾기
package ex02; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class App { public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { String path = "/save-form"; UserController uc = new UserController(); Method[] methods = uc.getClass().getDeclaredMethods(); for (Method mt : methods){ Annotation anno = mt.getDeclaredAnnotation(RequestMapping.class);//어노테이션 찾기 RequestMapping rm = (RequestMapping) anno; if(rm == null) break; // System.out.println(rm.uri()); if(rm.uri().equals(path)){ mt.invoke(uc); } } } }
어노테이션이 적용되어잇는 메소드를 찾고 메소드를 실행하는 코드
스프링에서 리플렉션이 실행되는 역활 및 시점
리플렉션의 역할: 스프링은 컴포넌트 스캔 시점, 빈 생성 및 초기화 시점, 그리고 런타임에 필요한 메서드를 호출할 때 리플렉션을 사용합니다.
- 컴포넌트 스캔 단계: 스프링은 리플렉션을 사용해 클래스에 붙은 어노테이션을 탐색하고, 빈으로 등록해야 할 클래스를 식별합니다.
- 빈 생성 및 의존성 주입 단계: 리플렉션을 사용해
@Autowired
등의 어노테이션이 붙은 필드나 메서드를 찾아 의존성을 주입합니다.
- 런타임 동작: 스프링 MVC 같은 웹 애플리케이션에서는 요청을 처리할 메서드를 찾아 실행할 때 리플렉션을 사용합니다.
Share article