我设置了两个 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">