Home [Spring] 1.10.2. Using Meta-annotations and Composed Annotations
Post
Cancel

[Spring] 1.10.2. Using Meta-annotations and Composed Annotations

1.10.2. Using Meta-annotations and Composed Annotations

Many of the annotations provided by Spring can be used as meta-annotations in your own code. A meta-annotation is an annotation that can be applied to another annotation. For example, the @Service annotation mentioned earlier is meta-annotated with @Component, as the following example shows:

  • 스프링이 제공한 많은 annotations은 당신 자신의 코드에서 meta-annotations으로 사용될 수 있다.
  • 메타 주석(meta annotation)은 다른 annotation에 적용할 수 있는 annotation이다.
  • 예를 들어, 앞에서 언급한 @Service annotation은 다음과 같은 예에서 알 수 있듯이 @Component와 함께 meta-annotated된다.
1
2
3
4
5
6
7
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Component
annotation class Service {
    // ...
}

You can also combine meta-annotations to create “composed annotations”. For example, the @RestController annotation from Spring MVC is composed of @Controller and @ResponseBody.

  • meta-annotations를 결합하여 “Composed Annotations”를 만들 수도 있다.
  • 예를 들어 Spring MVC의 @RestController 주석은 @Controller@ResponseBody로 구성된다.

In addition, composed annotations can optionally redeclare attributes from meta-annotations to allow customization. This can be particularly useful when you want to only expose a subset of the meta-annotation’s attributes. For example, Spring’s @SessionScope annotation hardcodes the scope name to session but still allows customization of the proxyMode. The following listing shows the definition of the SessionScope annotation:

  • 또한 composed annotations은 선택적으로 meta-annotations에서 속성을 재선언하여 사용자 정의(customization)를 허용할 수 있다.
  • 이는 meta-annotation 속성의 부분 집합만 노출하려는 경우에 특히 유용할 수 있다.
  • 예를 들어 Spring의 @SessionScope 주석은 스코프 이름을 session으로 하드 코딩하지만 proxyMode의 사용자 지정을 허용한다.
  • 다음 목록은 SessionScope annotation의 정의를 보여준다.
1
2
3
4
5
6
7
8
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Scope(WebApplicationContext.SCOPE_SESSION)
annotation class SessionScope(
        @get:AliasFor(annotation = Scope::class)
        val proxyMode: ScopedProxyMode = ScopedProxyMode.TARGET_CLASS
)

You can then use @SessionScope without declaring the proxyMode as follows:

  • 그런 다음 다음과 같이 proxyMode를 선언하지 않고 @SessionScope를 사용할 수 있다.
1
2
3
4
5
@Service
@SessionScope
class SessionScopedService {
    // ...
}

You can also override the value for the proxyMode, as the following example shows:

다음 예제에서 알 수 있듯이 proxyMode의 값을 재정의할 수도 있다.

1
2
3
4
5
@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
class SessionScopedUserService : UserService {
    // ...
}

For further details, see the Spring Annotation Programming Model wiki page.

References

This post is licensed under CC BY 4.0 by the author.

[Spring] 1.10.1. @Component and Further Stereotype Annotations

[Spring] 1.12. Java-based Container Configuration