2010-02-26 109 views
2

我正在使用Spring AOP分析遺留應用程序,我想根據需要做出的決定獲取一些數據點。使用問題:Spring AOP與AspectJ編織

這就是我到目前爲止所做的: 我已經使用Spring AOP創建了代碼和配置,這將幫助我剖析由Spring容器管理的bean。

在分析dao層時,我發現傳統應用程序使用c3p0框架 - 具體地說,ComboPooledDataSource類。由於這個類是最後一個類,因此我無法再使用Spring AOP工作 - 因爲cglib無法爲最終類創建代理!

面對這個障礙,我打算使用方面編譯時編織技術。 我想知道這是正確的決定,還是有其他方法可以使用Spring AOP本身來解決這個問題。請告訴我。

配置信息:

<bean id="sample_dao" class="com.foo.SampleDaoImpl"> 
    <property name="dataSource" ref="sample_data_source"/> 
    .. 
    <property name="sampleProperty" ref="sample_bean"/> 
</bean> 

    <bean id="sample_data_source" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" depends-on="some_sample"> 
    <property name="driverClass" value="${driverClassName}"/> 
    <property name="jdbcUrl" value="${url}"/> 
    <property name="user" value="${username}"/> 
    <property name="password" value="${password}"/> 
    <property name="initialPoolSize" value="1"/> 
    <property name="maxPoolSize" value="4"/> 
    <property name="acquireIncrement" value="1"/> 
    <property name="preferredTestQuery" value="select 1 from sample_table"/> 
    <property name="idleConnectionTestPeriod" value="30"/> 
    <property name="testConnectionOnCheckin" value="true"/> 
    <property name="acquireRetryAttempts" value="3"/> 
    <property name="connectionCustomizerClassName" value="com.foo.SampleConnectionCustomizer"/> 

+0

@KM你應該接受一個答案,如果它已經爲你工作(在投票櫃檯下方有一個勾號) – Bozho 2010-02-26 06:40:31

回答

5

取決於您是否已經在你的項目中使用AspectJ時,你可能會發現下面的方法更簡單:

環繞你ComboPooledDataSource例如在非-final裝飾類實例; cglib應該能夠代理裝飾器而不需要任何明智的。

假設 - 爲例子的緣故 - 從你SampleDaoImpldataSource屬性是javax.sql.DataSource類型:

public class ComboPooledDataSourceDecorator implements javax.sql.DataSource { 

    private ComboPooledDataSource delegate; 

    public void setDelegate(ComboPooledDataSource delegate) { 
     this.delegate = delegate; 
    } 

    public Connection getConnection() { 
     return delegate.getConnection(); 
    } 

    // other methods of javax.sql.DataSource 

} 

線成這樣的春天:

<bean id="sample_data_source" class="mystuff.ComboPooledDataSourceDecorator"> 
    <property name="delegate"> 
     <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     ... 
     </bean> 
    </property> 
</bean> 
+0

這解決了我的問題 - 謝謝!不過,我可能會進行AspectJ編織,因爲這些應用程序的某些部分仍然未被Spring覆蓋。 – 2010-02-26 02:30:19

相關問題