2010-02-26 112 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

相关问题