2012-12-10 48 views
0

在我的spring控制器中,使用方面進行了註釋,我試圖刪除CGLib代理並將其替換爲JDK動態代理。我知道Spring AOP在類沒有實現接口時使用CGLib,因爲JDK動態代理只能在接口上工作。我也意識到註釋需要在接口和實現類中都存在。但是,我遇到的問題是控制器不再顯示爲具有JDK代理的bean。如何讓Spring控制器,AOP和JDK代理一起工作

我的控制器bean是掃描像這樣:

<context:annotation-config/> 
<context:component-scan base-package="com.package.name"/> 

這工作,但控制器顯示爲CGLibController $$ EnhancerByCGLIB $$ 5f0b2287:

package com.package.name; 
@Controller 
public class CGLibController { 
    @AOP_Aspect 
    @RequestMapping("some_url") 
    public void foo(); 
} 

//in a bean post processor 
//in postProcessAfterInitialization(Object bean, String beanName) 
    Controller controller = AnnotationUtils 
     .findAnnotation(bean.getClass(), Controller.class); 
//controller will exist 
//bean name is CGLibController$$EnhancerByCGLIB$$5f0b2287 

這是不行的,它從來沒有去豆後處理器:

package com.package.name; 
@Controller 
public interface ITest{ 
    @AOP_Aspect 
    @RequestMapping("some_url") 
    public void foo(); 
} 

package com.package.name; 
@Controller 
public class DynamicController implements ITest{ 
    @AOP_Aspect 
    @RequestMapping("some_url") 
    public void foo(); 
} 

但是,如果我明確地創建這個動態icController豆在

<bean class="com.package.name.DynamicController"/> 

然後當我啓動我的服務器ServletContext中抱怨說,豆

初始化失敗;嵌套異常是 java.lang.IllegalStateException:無法將處理程序 'dynamicController'映射到URL路徑[some_url]:映射了[class $ Proxy61]類型的處理程序 。

因此,這裏發生了一些事情,DynamicController是一個動態代理。但我不知道還有什麼事情發生,我知道它不再是一個bean /控制器。我不想要「控制器,方面,動態代理:挑選任何兩個」我想要所有三個。這可能以某種方式嗎?

+0

你的組件掃描似乎是'com.name.package',但你的控制器是'com.package.name'....這只是一個錯字? –

+0

是的,這是一個演示,我會修復它 – DanielKWinsor

+0

好奇 - 你怎麼確定這個bean根本沒有被創建。不知道我是否完全理解了這個問題 - 是否沒有創建bean或者beanpostprocessor是否攔截動態代理 –

回答

0

爲了拿起這個bean,我必須在postProcessBeforeInitialization NOT postProcessAfterInitialization中處理它,就像我之前做的那樣。我推測它在初始化時被代理,並且弄亂了某些東西。

正如我暗示的那樣,DynamicController實際上是一個JDK動態代理,但代理背後的真正對象是bean。然而!當使用代理和編程接口時,註釋必須位於接口上,根據我丟失的某些源代碼。沒有他們的界面,春天不知道。並且註釋必須位於具體類上才能使bean後置處理器正常工作,僅在界面上是不夠的。

0

我不是100%確定您的BeanPostProcessor正在嘗試做什麼,或者如果您控制其中的代碼,但似乎可以安全地假設它沒有排序,並且因此在代理創建後進行處理(這將有默認的最低優先級,但在無序之前)。也許你可以實現Ordered,並給它一個低階(如0)?