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

标签 java parsing annotations placeholder

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

@Value("#{aParameter}")

或在 JSF 2 中

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

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

提前致谢。

最佳答案

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

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

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

关于java - 使用占位符创建自定义注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16613896/

相关文章:

java - 如何将字节与字符分开?

java - 如何设置 Handler/Looper 在 Service 回调中调用 requestLocationUpdates

PEG (Grako) 的选项解析不足?

java - 带有@BeanParam 的空 pojo

java - 使用 Java 注解限制方法的执行

java - 算术中的对象值和局部值

java - MySQL classNotFoundException & 找不到适合 jdbc 的驱动程序

html - 从 JSON 对象中的非结构化字符串中提取 html 标签和数据

python - 我可以查看使用 lxml 从 html 文档解析的元素源的实际行吗

iphone - 多个注释数组,每个数组的引脚颜色不同?