我尝试进行切入点,以记录SQL查询
@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中创建了jdbcTemplate bean,并在我的所有DAO中自动启用了它。工作得非常好,但添加切入点会产生异常。有任何想法吗 ??
答案 0 :(得分:8)
默认情况下,Spring使用JDK动态代理来应用AOP。 (有关代理的更多信息,请参阅here)。
创建动态类(com.sun.proxy.$Proxy53
)会实现目标类实现的所有接口。适用于JdbcTemplate
和JdbcOperations
的{{1}}。因此,动态类是InitializingBean
但不是JdbcOperations
,因此注入失败。
你有几个解决方案
JdbcTemplate
代替课程JdbcOperations
进行编程现在选项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,并且可能会更复杂一点。
链接