2008-11-20 41 views
3

我有兩個春天的代理設置:Spring AOP的代理,是不是

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

而且第一指示什麼是錯的是我得到這個錯誤:

Could not autowire field: . . . nested exception is java.lang.IllegalArgumentException

如果我註釋@Qualifier註釋並再次運行我的單元測試,我得到這個:

No unique bean of type ... expected single matching bean but found 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 2008-11-20 13:38:26

回答

9

如果代理的目標實現至少一個接口,那麼Spring的默認行爲是創建一個實現目標的所有接口的JDK代理。這意味着它不會是目標類的子類。您可以通過強制創建CGLIB代理來替代目標的動態子類。

作爲一般規則,如果您打算使用AOP,但只能以有限的方式使用接口,則需要強制執行CGLIB。否則,您的容器中將包含許多與您加載的bean實現不同的JDK代理。

見崖邁爾斯博客:Spring AOP: CGLIB or JDK Dynamic Proxies?

1

這是很容易解決,一旦我想通了。 SpringDao不再繼承JdbcDaoSupport,現在它可以工作。