Spring:将属性作为值注入到注释中

时间:2015-04-24 16:33:32

标签: spring dependency-injection annotations spring-aop

我试图将一个值注入Custom Annotation,但Spring似乎没有评估。

这是我的注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnno {
    String var1();
    String var2();
}

这是我的Bean(它是在Spring配置文件中创建的),带有注释:

public class MyClass {

    @MyCustomAnno(var1 = "${some.property.one}",
                  var2 = "${some.property.two}")
    public void someMethod() {
    // do something here
    }
}

以下是我尝试使用传递给注释的值的方面:

@Aspect
public class MyAop {

    @Around(value="@annotation(myCustomAnno)",argNames="myCustomAnno")
    public Object aroundMethod(MyCustomAnno myCustomAnno) {
        int intVar1 = Integer.parseInt(myCustomAnno.var1());
        int intVar2 = Integer.parseInt(myCustomAnno.var2());

        // ....
    }
}

在around方法中,我收到一个NumberFormatException:对于输入字符串:$ {some.property.one}。这意味着Spring出于某种原因没有注入该值。

如果您想知道,在同一个类中我可以执行正常的@Value注释并正确注入值:

@Value("${some.property.one}")
private propertyOne;            // This works

是否有可能做我想做的事情,如果可以,怎么做?

1 个答案:

答案 0 :(得分:0)

AFAIK,自定义注释中未解析占位符。但是,您可以在Aspect本身中解决它们。

例如:

@Aspect
class MyAop implements EmbeddedValueResolverAware {

    private StringValueResolver resolver;

    @Around(value="@annotation(myCustomAnno)",argNames="myCustomAnno")
    public void play(MyCustomAnno ann) {
        System.out.println(resolver.resolveStringValue(ann.var1()));
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.resolver = resolver;
    }
}