2012-12-10 47 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)?