【问题标题】:Usage question: Spring AOP vs. AspectJ weaving使用问题:Spring AOP vs. AspectJ weaving
【发布时间】:2010-02-26 00:16:53
【问题描述】:

我正在使用 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"/>

【问题讨论】:

  • @KM 如果它对你有用,你应该接受一个答案(投票计数器下方有一个勾号)

标签: spring aop aspectj


【解决方案1】:

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

将您的 ComboPooledDataSource 实例包装在非最终装饰器类实例中; cglib 应该能够代理装饰器,而不需要更聪明。

假设 - 为了示例的缘故 - 您的 SampleDaoImpl 类中的 dataSource 属性是 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>

【讨论】:

  • 这解决了我的问题 - 谢谢!但是,我可能会选择 AspectJ 编织,因为应用程序的某些部分仍未被 Spring 覆盖。
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多