Spring AOP代理不是什么?

3

我有两个Spring代理设置:

  <bean id="simpleBean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target">
        <ref local="simpleBeanTarget"/>
    </property>
    <property name="interceptorNames">
        <list>
            <value>cacheInterceptor</value>
        </list>
    </property>
</bean>   



 <bean id="springDao" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="springDaoTarget"/>
        <property name="interceptorNames">
            <list>
                <value>daoInterceptor</value>
            </list>
        </property>

    </bean>

simpleBean 运行正常 -- springDao 不行。

SpringDao 类如下:

public class SpringDao extends JdbcDaoSupport {

private SimpleJdbcTemplate simpleJdbcTemplate;

public SimpleJdbcTemplate getSimpleJdbcTemplate() {

    if (simpleJdbcTemplate==null) {
        simpleJdbcTemplate= new SimpleJdbcTemplate(getDataSource());
    }
    return simpleJdbcTemplate;
}
    ...

我有一个单元测试,自动装配如下:

@Autowired
@Qualifier("springDao")
protected SpringDao springDao;

当出现以下错误时,这是第一个表明有问题的迹象:

无法自动连接字段:……嵌套异常为java.lang.IllegalArgumentException

如果我注释掉@Qualifier注解并再次运行单元测试,我会得到以下结果:

没有唯一的bean类型……期望单个匹配的bean但找到了2个: [springDaoTarget,springDao]

这正是我所预期的。

因此,我将我的自动装配更改为

@Autowired
@Qualifier("springDaoTarget")
protected SpringCustomerCapacityDao springDao;

我将以下内容添加到我的单元测试中:

        Object proxy = applicationContext.getBean("springDao");

    Assert.assertNotNull(proxy);
    Assert.assertTrue(proxy instanceof SpringDao);

instanceof测试失败了,这对我来说意味着我的代理不是真正的代理。

所以我很困惑。发生了什么?我该如何解决?

编辑 这里是请求的springDaoTarget定义,这将使许多人失望:

<bean id="springDaoTarget" class="com.company.SpringDao">


1
你正在使用Springframework的哪个版本?我假设是1.0。 - leeand00
1
是的没错。Spring 1.0配合@Autowired ;) - krosenvold
2个回答

9
如果你的代理目标至少实现了一个接口,那么Spring的默认行为是创建一个JDK代理,该代理实现目标的所有接口。这意味着它不会成为目标类的子类。你可以通过强制创建CGLIB代理来覆盖这一点,CGLIB代理是目标的动态子类。
一般而言,如果你将使用AOP但仅以有限方式使用接口,则需要强制使用CGLIB。否则,你的容器中将有很多JDK代理,它们与你加载的bean实现的类型不同。
请参阅Cliff Meyers的博客:Spring AOP:CGLIB或JDK动态代理?

1

一旦我弄清楚了,修复起来很容易。SpringDao不再继承JdbcDaoSupport,现在它可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接