我正在创建一些自定义注释。我需要创建一些带有“占位符”的人,因为它在 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/