Spring com.sun.proxy.$proxy在jdbcTemplate上创建切入点时出错
我试图切入点,记录SQL查询Spring com.sun.proxy.$proxy在jdbcTemplate上创建切入点时出错,spring,spring-mvc,proxy,aspectj,spring-aop,Spring,Spring Mvc,Proxy,Aspectj,Spring Aop,我试图切入点,记录SQL查询 @Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))") public void logSQLQueries() { System.out.println("@@"); } 我试图实现这里的代码; 但我明白了 java.lang.IllegalArgumentException: Can not set org.springfram
@Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))")
public void logSQLQueries() {
System.out.println("@@");
}
我试图实现这里的代码;
但我明白了
java.lang.IllegalArgumentException: Can not set org.springframework.jdbc.core.JdbcTemplate field com.xyz.abc.dao.ABCDaoImpl.jdbcTemplate to com.sun.proxy.$Proxy53
我已经在我的*-servlet.xml中创建了JDBCTemplatebean,并在我的所有DAO中自动连接了它。工作非常好,但添加切入点会产生例外。有什么想法吗 Spring默认使用JDK动态代理来应用AOP。(有关代理的更多信息,请参阅) 所发生的事情是创建一个动态类(
com.sun.proxy.$Proxy53
),它实现了目标类实现的所有接口。对于jdbc模板
,即jdbc操作
和初始化bean
。因此,动态类是一个jdbc操作
,而不是jdbc模板
,因此注入失败
你有几个解决办法
jdbc操作
而不是类jdbc模板
进行编程@Autowired
private JdbcTemplate jdbcTemplate;
到
如果您正在扩展JdbcDaoSupport
,您可能会陷入困境,然后它将无法工作
选项2,假设您有,因为这涉及(可能)一个java代理,并且可能会稍微复杂一些
链接
编程到接口,而不是具体的类。Spring使用代理应用AOP。不要使用jdbc模板
而使用jdbc操作
,后者是接口(您可能也希望在您的pointcut中使用)。或者从基于接口的代理切换到基于类的代理,或者不使用代理,而是使用loadtime编织来应用方面。您所指的示例甚至做到了@M.Deinum刚刚告诉您的,您修改了它!顺便说一句,SpringAOP也可以使用类而不是更好的接口,但是你需要在类路径上使用CGLIB。我第一次尝试使用接口,但是当它不起作用时,我尝试了一些不同的方法。我不理解这里代理的概念。你能提供一个我能理解这个概念的参考资料吗。此外,我如何切换到基于类的代理,或使用加载时编织。谢谢你的回复,请务必写一个答案,这样我可以标记它。@kriegaex我的类路径中已经有cglib,你能解释一下它在这里有什么帮助吗。谢谢请发布完整的调用堆栈并切换回接口。谢谢!解决了我的问题。尝试了前两种解决方案,但都不起作用。至少在Spring 4.2.x中,当您遇到一个不同的问题时(基本上第一个问题应该总是有效的,如果它不起作用,那么您有一些方法来启用(可能)创建代理的代理)。
@Autowired
private JdbcOperations jdbcTemplate;