在我的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 /控制器。我不想要「控制器,方面,動態代理:挑選任何兩個」我想要所有三個。這可能以某種方式嗎?
你的組件掃描似乎是'com.name.package',但你的控制器是'com.package.name'....這只是一個錯字? –
是的,這是一個演示,我會修復它 – DanielKWinsor
好奇 - 你怎麼確定這個bean根本沒有被創建。不知道我是否完全理解了這個問題 - 是否沒有創建bean或者beanpostprocessor是否攔截動態代理 –