使用问题:Spring AOP与AspectJ编织

使用问题:Spring AOP与AspectJ编织,spring,aop,aspectj,Spring,Aop,Aspectj,我正在使用SpringAOP分析一个遗留应用程序,我想获得一些关于我需要做出的决策的数据点 这就是我到目前为止所做的: 我已经使用SpringAOP创建了代码和配置,这将帮助我分析Spring容器管理的bean 在分析dao层时,我发现遗留应用程序使用c3p0框架——具体地说,是ComboPooledDataSource类。因为这个类是最终类,我不能再使用SpringAOP了——因为cglib不能为最终类创建代理 面对这个障碍,我计划使用方面编译时编织技术。 我想知道这是否是正确的决定,或者是否

我正在使用SpringAOP分析一个遗留应用程序,我想获得一些关于我需要做出的决策的数据点

这就是我到目前为止所做的: 我已经使用SpringAOP创建了代码和配置,这将帮助我分析Spring容器管理的bean

在分析dao层时,我发现遗留应用程序使用c3p0框架——具体地说,是ComboPooledDataSource类。因为这个类是最终类,我不能再使用SpringAOP了——因为cglib不能为最终类创建代理

面对这个障碍,我计划使用方面编译时编织技术。 我想知道这是否是正确的决定,或者是否有其他方法可以使用SpringAOP本身克服这个问题。请让我知道

配置信息:

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

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

将ComboPooledDataSource实例包装在非最终装饰器类实例中;cglib应该能够代理decorator,而不会变得更聪明

为了示例起见,假设SampleDaoImpl类中的dataSource属性为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 weaving,因为Spring还未涵盖应用程序的某些部分。@KM如果答案对您有效,您应该接受答案投票计数器下方有一个勾号
<bean id="sample_data_source" class="mystuff.ComboPooledDataSourceDecorator">
   <property name="delegate">
      <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
         ...
      </bean>
   </property>
</bean>