在我的带有方面注释的 spring 控制器中,我试图删除 CGLib 代理并用 JDK 动态代理替换它们。我知道当类没有实现接口时 Spring AOP 使用 CGLib,因为 JDK 动态代理只在接口上工作。我还意识到,接口和实现类上都需要有注解。但是,我遇到的问题是控制器不再显示为带有 JDK 代理的 bean。
我的控制器 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
这不起作用,它永远不会到达 bean 后处理器:
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();
}
但是,如果我明确地创建这个 DynamicController bean,如
<bean class="com.package.name.DynamicController"/>
然后当我启动我的服务器时 ServletContext 抱怨说
bean初始化失败;嵌套异常是 java.lang.IllegalStateException:无法将处理程序“dynamicController”映射到 URL 路径 [some_url]:已经映射了类型为 [class $Proxy61] 的处理程序。
所以这里发生了一些事情,DynamicController 是一个动态代理。但我不知道还发生了什么,我知道它不再是一个 bean/控制器。我不想要“控制器、方面、动态代理:选择任何两个”我想要全部三个。这有可能吗?