스프링으로부터 제공되는 많은 어노테이션들이 메타 어노테이션으로써 사용될 수 있다. 메타 어노테이션은 다른 어노테이션에 적용될 수 있는 어노테이션이다. 예를 들어, @Service 어노테이션은 @Component에 대한 메타 어노테이션이다. 다음 예시를 보자.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
// ...
}
메타 어노테이션들을 결합해 "구성 어노테이션"들을 만들어낼 수도 있다. 예를 들어, 스프링 MVC의 @RestController 어노테이션은 @Controller와 @ResponseBody가 구성된 것이다.
이와 더불어, 구성 어노테이션들은 커스터마이징을 위해 메타 어노테이션의 속성들을 선택적으로 재선언할 수 있다. 이는 메타 어노테이션 속성들의 부분집합만을 노출하고 싶을 때 특히 유용하다. 예를 들어, 스프링의 @SessionScope 어노테이션은 'session'이라는 scope명으로 하드코딩되어있다. 하지만 여전히 proxyMode의 커스터마이징을 허용한다. 다음은 SessionScope 어노테이션의 정의를 보여준다.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {
/**
* {@link Scope#proxyMode}에 대한 Alias
* <p> {@link ScopedProxyMode#TARGET_CLASS}의 기본
*/
@AliasFor(annotation = Scope.class}
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}
따라서 다음과 같이 proxyMode를 선언하지 않고도 @SessionScope를 사용할 수 있다.
@Service
@SessionScope
public class SessionScopedService {
// ...
}
다음 예시와 같이 proxyMode의 값을 오버라이드할 수도 있다.
@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
public class SessionScopedUserService implements UserService {
// ...
}
더 자세한 내용은 '스프링 어노테이션 프로그래밍 모델' 위키페이지를 참조하라.
'SpringFramework Core - I. IoC 컨테이너 > 10. 클래스패스 스캐닝과 관리받는 컴포넌트들' 카테고리의 다른 글
10.5. 컴포넌트 안에서 bean 메타데이터 정의하기 (0) | 2020.04.14 |
---|---|
10.4. 스캐닝을 커스터마이즈하기 위해 필터 사용하기 (0) | 2020.04.14 |
10.3. 자동적으로 클래스를 찾아 bean 정의로 등록시키기 (0) | 2020.04.14 |
10.1. @Component와 더 많은 Stereotype 어노테이션들 (0) | 2020.04.14 |
10. 클래스패스 스캐닝과 관리받는 컴포넌트들 (0) | 2020.04.14 |