如何让Spring控制器、AOP和JDK代理一起工作

如何让Spring控制器、AOP和JDK代理一起工作,spring,proxy,controller,spring-aop,cglib,Spring,Proxy,Controller,Spring Aop,Cglib,在我的spring控制器中,用aspect注释,我试图删除CGLib代理并用JDK动态代理替换它们。我知道SpringAOP在类不实现接口时使用CGLib,因为JDK动态代理只在接口上工作。我还认识到,接口和实现类上都需要有注释。然而,我遇到的问题是,控制器不再显示为带有JDK代理的bean 我的控制器bean会被扫描如下: <context:annotation-config/> <context:component-scan base-package="com.packag

在我的spring控制器中,用aspect注释,我试图删除CGLib代理并用JDK动态代理替换它们。我知道SpringAOP在类不实现接口时使用CGLib,因为JDK动态代理只在接口上工作。我还认识到,接口和实现类上都需要有注释。然而,我遇到的问题是,控制器不再显示为带有JDK代理的bean

我的控制器bean会被扫描如下:

<context:annotation-config/>
<context:component-scan base-package="com.package.name"/>
这不起作用,它永远不会到达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路径[某些URL]:已存在处理程序 类型为映射的[class$Proxy61]


这里发生了一些事情,DynamicController是一个动态代理。但我不知道还会发生什么,我知道它不再是bean/控制器了。我不想要“控制器、方面、动态代理:选择任意两个”,我想要所有三个。这有可能吗?

我不能100%确定BeanPostProcessor试图做什么,或者是否控制其中的代码,但似乎可以安全地假设它没有排序,因此在创建代理之后(默认优先级最低,但在无序之前)处理它。也许您可以实现Ordered并给它一个低阶(如0)?

为了获取这个bean,我必须在初始化之前的后处理中处理它,而不是像以前那样在初始化之后的后处理中处理它。我推测它在初始化时被代理,这会把事情搞砸


正如我所暗示的,DynamicController实际上是一个JDK动态代理,但代理背后的真正对象是bean。然而!当使用代理和编程接口时,注释必须在接口上,根据我丢失的一些源代码。如果界面上没有它们,spring就不会知道。注释必须在具体类上,以便bean后处理器工作,仅在接口上是不够的。

您的组件扫描似乎是针对
com.name.package
的,但您的控制器位于
com.package.name
中。这只是一个输入错误吗?是的,这是一个演示,我会很好奇地解决这个问题——你如何确定这个bean没有被创建呢。我也不确定我是否完全理解了这个问题——问题是bean没有被创建,还是beanpostprocessor没有拦截动态代理?我正在运行,并为您提供详细的分析。在我看来,当您复制接口和类中的所有注释(Controller、AOP_方面、Requestmapping)时,您让我感到困惑,甚至可能让spring感到困惑。仔细检查示例?不相关的旁注:我认为
意味着
,因此您有一些不必要的重复。
<bean class="com.package.name.DynamicController"/>