用法问题:Spring AOP与AspectJ编织

KM.*_*KM. 2 aop spring aspectj

我正在使用Spring AOP分析遗留应用程序,我希望得到一些关于我需要做出的决定的数据点.

这就是我到目前为止所做的:我使用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"/>
Run Code Online (Sandbox Code Playgroud)

小智 5

根据您是否已在项目中使用AspectJ,您可能会发现以下方法更简单:

将您的ComboPooledDataSource实例包装在非final的装饰器类实例中; 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

}
Run Code Online (Sandbox Code Playgroud)

像这样将它连接到弹簧:

<bean id="sample_data_source" class="mystuff.ComboPooledDataSourceDecorator">
   <property name="delegate">
      <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
         ...
      </bean>
   </property>
</bean>
Run Code Online (Sandbox Code Playgroud)