没有为Transactional Proxies创建CGLIB代理

时间:2013-04-05 09:05:32

标签: spring spring-aop spring-transactions cglib

这是我正在做的事情:

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

感谢。

1 个答案:

答案 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