簡體   English   中英

沒有的Spring AOP代理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM