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">

4

2 回答 2

9

如果你的代理的目标实现了至少一个接口,那么 Spring 的默认行为是创建一个 JDK 代理来实现目标的所有接口。这意味着它不会是目标类的子类。您可以通过强制创建 CGLIB 代理来覆盖它,而这些代理是目标的动态子类。

作为一般规则,如果您要使用 AOP 但仅以有限的方式使用接口,您将需要强制 CGLIB。否则,您的容器中将有许多与您加载的 bean 实现不同类型的 JDK 代理。

请参阅 Cliff Meyers 博客:Spring AOP:CGLIB 还是 JDK 动态代理?

于 2008-11-29T07:28:58.243 回答
1

一旦我弄清楚了,这很容易解决。SpringDao 不再从 JdbcDaoSupport 继承,现在它可以工作了。

于 2008-11-24T16:51:54.597 回答