[英]The Spring AOP Proxy that isn't
我有兩個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);
而且testof的測試失敗了,對我而言,這意味着我的代理並不是我的代理。
所以我很困惑。 這是怎么回事? 我怎樣才能解決這個問題?
編輯這里是請求的springDaoTarget定義,它將令許多人失望:
<bean id="springDaoTarget" class="com.company.SpringDao">
如果代理的目標實現至少一個接口,那么Spring的默認行為是創建一個實現目標所有接口的JDK代理。 這意味着它不會是目標類的子類。 您可以通過強制創建CGLIB代理來覆蓋它,而CGLIB代理是目標的動態子類。
作為一般規則,如果您打算使用AOP但僅以有限的方式使用接口,則需要強制使用CGLIB。 否則,您的容器中將有許多JDK代理,這些代理的類型與您加載的bean實現的類型不同。
請參閱Cliff Meyers博客: Spring AOP:CGLIB或JDK Dynamic Proxies?
一旦我弄明白,這很容易解決。 SpringDao不再繼承JdbcDaoSupport,現在它可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.