使用占位符创建自定义注释?

时间:2013-05-17 16:30:59

标签: java parsing annotations placeholder

我正在创建一些自定义注释。我需要在Spring中使用“place-holder”来创建某些人

@Value("#{aParameter}")

或在JSF 2中

@ManagedProperty(value="#{aParameter}")

我想我必须在某个地方有一个映射(.properties或.xml文件或枚举类),但我需要知道在自定义注释界面中编写这种方法。我的意思是如何在annoatation界面中声明一个占位符?以及如何在某处应用注释时确保其值(在映射文件中)的分配?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您不会在注释声明中执行此操作 - 您可以使用该注释在代码中执行此操作。

例如,@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);
}

因此,解决属性等问题的逻辑被放在类中 实际上使用读取注释并使它们有用。