2016-03-01 144 views
0

我在Spring中使用自定義註釋創建Bean。當我引入AOP時,Spring Class.getAnnotationsByType無法正常工作

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CliCommand { 
    Slice slice(); 
} 

運行時(啓動)期間我想加載所有具有此批註的類。

在這個過程中我打電話。

CliCommand[] cliAnnotations = myclass.getAnnotationsByType(CliCommand.class); 

在我介紹AOP之前,它工作正常。

但是現在這返回NULL。

我的AOP看起來像這樣。

@Pointcut("within(com.companyx.cli..*)") 
public void cliLayer() { 
} 

@Before("cliLayer()") 
public void injectCLI(JoinPoint jp){ 
    MDC.put(ConnectApplicationContext.LOG_LAYER_NAME, Layer.CLI); 
} 

我不知道爲什麼會發生這種情況。有沒有人見過這個。這與cgLib有關嗎?

+0

我已經發現了一些註釋您的自定義註解。 – Richie

回答

0

Cglib在創建代理時生成類的子代。因此,如果您的示例中的「myclass」是通過someCglibObject.getClass()獲得的,您將獲得cglib子類,而不是您的。

在這種情況下做出註解聲明對父類可通過childClass.getAnnotationsByType你應該@Inherited

+0

非常感謝。我轉而使用類構造來檢查這個類,這一切都奏效了。我通過調用'Class cliPrototypeClass = applicationContext.getType(beanName); '而不是'Map beansOfType = applicationContext.getBeansOfType(CliCommand.class);'同意,雖然你的答案是現貨。謝謝。 – Richie