1

这是我正在做的事情:

@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 代理?

谢谢。

4

1 回答 1

0

如果您使用接口,则根据您将 Spring 源代码转换为对象,然后使用 JDK 代理,如果您使用普通类,则使用 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
于 2013-06-26T09:04:31.070 回答