【问题标题】:Creating custom annotations with place-holder?使用占位符创建自定义注释?
【发布时间】:2013-05-12 21:47:57
【问题描述】:

我正在创建一些自定义注释。我需要创建带有“占位符”的人,因为它在 Spring 中使用

@Value("#{aParameter}")

或在 JSF 2 中

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

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

提前致谢。

【问题讨论】:

    标签: java parsing annotations placeholder


    【解决方案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);
    }
    

    因此,负责解析属性等的逻辑被放置在类中 实际使用读取注释并使其有用。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2013-12-12
      • 2019-02-08
      相关资源
      最近更新 更多