2

Spring AOP を使用してレガシー アプリケーションのプロファイリングに取り組んでおり、必要な決定に関するデータ ポイントを取得したいと考えています。

これは私がこれまでに行ったことです。Spring コンテナーによって管理されている Bean のプロファイルを作成するのに役立つ Spring AOP を使用してコードと構成を作成しました。

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"/>

4

1 に答える 1

5

プロジェクトですでに AspectJ を使用しているかどうかに応じて、次のアプローチがより簡単になる場合があります。

ComboPooledDataSource インスタンスを非最終デコレータ クラス インスタンスにラップします。cglib は、賢くならずにデコレータをプロキシできるはずです。

例として、クラスのdataSource属性のタイプが であると仮定します。SampleDaoImpljavax.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>
于 2010-02-26T01:39:12.067 に答える