2013-08-04 174 views
0

我一直試圖在我的註釋中設置logTime屬性在spring xml中。我看到這並不像我第一次想到的那麼容易。春季設置註釋屬性xml

@Component 
@Retention(RetentionPolicy.RUNTIME) 
public @interface LogExecTime { 

public boolean logTime() default true;  
} 

我都試過,沒有運氣的接口使用@Value註釋:

I) 

    @Component 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface LogExecTime { 
    @Value("#{ConfigureAnnotation.doLogging}") 
public boolean logTime() default true;  
    } 

II)  
@LogExecTime([email protected]("#{ConfigureAnnotation.doLogging}")) 

任何想法如何,我可以在XML層次做到這一點或者是這不可能與註釋依賴注入?

回答

1

是的 - 這不會工作。

@LogExecTime([email protected]("#{ConfigureAnnotation.doLogging}")) 

永遠不會編譯。註釋不是可執行代碼,它們只是標記 - 額外的信息被插入到整個類文件銷售中。

你既可以把這個:

@Value("#{ConfigureAnnotation.doLogging}") 
boolean logTime = true; 

由於在彈簧上的真正的現場管理bean的地方,或有改變你的註釋是這樣的:

@Component 
@Retention(RetentionPolicy.RUNTIME) 
public @interface LogExecTime { 

    public String logTime() default "true"; 
} 

,並有什麼是處理在運行時註釋也可以接受EL表達式並適當地解決它,並且您的組件將如下所示:

@LogExecTime(logTime = "#{ConfigureAnnotation.doLogging}") 
public class SomeComponent { 

    // blah blah blah 
} 
+0

嗨Iscoughlin。 @Value("#{ConfigureAnnotation.doLogging}") boolean logTime = true;不適用於我的註釋,但logTime = "#{ConfigureAnnotation.doLogging}"看起來可以。我的Aspect讀取它,但只打印「#{ConfigureAnnotation.doLogging}」,而不是我在xml中設置的值「true」。你能告訴我你將如何實現這一目標嗎? – MWright

+0

您需要對分配給註釋的值執行一些操作。在這種情況下,值爲 #{ConfigureAnnotation.doLogging} 因此,您需要實例化一個彈簧EL解析器來解析該值或解析出您的自身的鍵以及它的某些內容,如System.getProperty(annotation .value()。substring(2,annotation.value()。size()-3) – lscoughlin