注釈宣言では行いません。その注釈を使用するコードで行います。
たとえば、@Value
は次のように宣言されます。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
public @interface Value {
/**
* The actual value expression: e.g. "#{systemProperties.myProp}".
*/
String value();
}
org.springframework.web.bind.annotation.support.HandlerMethodInvoker
それがどのように使用されているかを追跡すると、クラスで値がアノテーションから直接フェッチされ、次のdefaultValue = ((Value) paramAnn).value();
ように解決されることがわかります。
if (defaultValue != null) {
args[i] = resolveDefaultValue(defaultValue);
}
...
class AnnotationMethodHandlerAdapter{
...
protected Object resolveDefaultValue(String value) {
if (beanFactory == null) {
return value;
}
String placeholdersResolved = beanFactory.resolveEmbeddedValue(value);
BeanExpressionResolver exprResolver = beanFactory.getBeanExpressionResolver();
if (exprResolver == null) {
return value;
}
return exprResolver.evaluate(placeholdersResolved, expressionContext);
}
そのため、プロパティの解決などを処理するロジックは、読み取り注釈を実際に使用して有用にするクラスに配置されます。