com.sun.proxy。$在jdbcTemplate上创建切入点时出现代理错误

时间:2014-05-15 10:08:53

标签: spring spring-mvc proxy aspectj spring-aop

我尝试进行切入点,以记录SQL查询

  @Before("execution(* org.springframework.jdbc.core.JdbcTemplate.*(String, ..))")
public void logSQLQueries() {
        System.out.println("@@");
    }

我正在尝试在这里实现代码; http://www.gotoquiz.com/web-coding/programming/java-programming/log-sql-statements-with-parameter-values-filled-in-spring-jdbc/

但我得到

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中创建了jdbcTemplate bean,并在我的所有DAO中自动启用了它。工作得非常好,但添加切入点会产生异常。有任何想法吗 ??

1 个答案:

答案 0 :(得分:8)

默认情况下,Spring使用JDK动态代理来应用AOP。 (有关代理的更多信息,请参阅here)。

创建动态类(com.sun.proxy.$Proxy53)会实现目标类实现的所有接口。适用于JdbcTemplateJdbcOperations的{​​{1}}。因此,动态类是InitializingBean但不是JdbcOperations,因此注入失败。

你有几个解决方案

  1. 使用界面JdbcTemplate代替课程JdbcOperations进行编程
  2. 使用基于类的代理
  3. 使用加载时间编织
  4. 现在选项1和2是最简单的,而选项3是最强大和最复杂的开始(参见下面的链接)。

    班级中的1改变

    JdbcTemplate

    @Autowired
    private JdbcTemplate jdbcTemplate;
    

    如果您正在延长@Autowired private JdbcOperations jdbcTemplate; ,那么您可能会陷入困境,然后它将无效。

    选项2,假设您JdbcDaoSupport<aop:aspectj-autoproxy />属性设置为proxy-target-class。这将需要cglib并将创建基于类的代理而不是基于接口的代理。

    对于选项3,我引用the reference guide,因为它涉及(可能)一个java-agent,并且可能会更复杂一点。

    链接

    1. Understanding AOP proxies
    2. Load-time weaving with AspectJ