这是我正在做的事情:
@Component("jdbcBookDao")
public class JdbcBookDao extends JdbcDaoSupport implements BookDao{
@Autowired
public void injectDataSource(DataSource dataSource){
setDataSource(dataSource);
}
@Transactional
public int getStock(int isbn){
String sql = "SELECT bs.STOCK FROM BOOK b, BOOK_STOCK bs WHERE b.id=bs.book_id AND b.isbn=?";
return getJdbcTemplate().queryForInt(sql, isbn);
}
}
在应用程序上下文中,我声明了:
<tx:annotation-driven proxy-target-class="true"/>
使用这个配置,我预计当我从上下文获取jdbcBookdao时,它将是一个CGLIB代理(因为我已将proxy-target-class设置为true)。但是当我调试时,它是作为JdkDynamicAopProxy的实例。有人可以解释为什么即使我请求CGLIB代理也会创建JDK代理吗?
感谢。
答案 0 :(得分:0)
如果您使用接口然后使用JDK代理,则根据您将Spring源代码转换为对象,如果您使用普通类,则使用cgLib。
e public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface()) {
return new JdkDynamicAopProxy(config);
}
if (!cglibAvailable) {
throw new AopConfigException(
"Cannot proxy target class because CGLIB2 is not available. " +
"Add CGLIB to the class path or specify proxy interfaces.");
}
return CglibProxyFactory.createCglibProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}nter code here