在我的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是否拦截动态代理 –