Вопрос об использовании: Spring AOP vs. AspectJ ткачество - PullRequest
2 голосов
/ 26 февраля 2010

Я работаю над профилированием унаследованного приложения с использованием Spring AOP и хочу получить некоторые данные о решении, которое мне нужно принять.

Это то, что я сделал до сих пор: Я создал код и конфигурацию с помощью Spring AOP, которая помогла бы мне профилировать bean-компоненты, управляемые контейнером Spring.

При профилировании слоя 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"/>

1 Ответ

5 голосов
/ 26 февраля 2010

В зависимости от того, используете ли вы уже AspectJ в своем проекте, следующий подход может оказаться проще:

Оберните ваш экземпляр ComboPooledDataSource в не финальный экземпляр класса декоратора; cglib должен быть в состоянии прокси декоратора, не будучи мудрым.

Предположим, ради примера, что атрибут dataSource из вашего SampleDaoImpl класса имеет тип 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>
...