2010-02-26 17 views
2

Je travaille sur le profilage d'une application héritée utilisant Spring AOP et je veux obtenir des points de données autour d'une décision que je dois prendre.Question d'utilisation: Spring AOP vs. AspectJ weaving

C'est ce que j'ai fait jusqu'à présent: J'ai créé le code et la configuration en utilisant Spring AOP qui m'aiderait à profiler les beans gérés par le conteneur Spring. Pendant le profilage de la couche dao, je trouve que l'application héritée utilise le framework c3p0 - en particulier, la classe ComboPooledDataSource. Comme cette classe est une classe finale, je ne peux plus travailler avec Spring AOP car cglib ne peut pas créer de proxy pour les classes finales!

Face à ce barrage routier, je prévois d'utiliser la technique de tissage temporel compilé. Je veux savoir si c'est la bonne décision ou s'il existe d'autres moyens de surmonter ce problème en utilisant Spring AOP lui-même. S'il vous plaît, faites-moi savoir.

informations Configuration:

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

+0

@KM vous êtes censé accepter une réponse si elle a fonctionné pour vous (il y a une coche en dessous du compteur de votes) – Bozho

Répondre

5

Selon que vous utilisiez ou non déjà AspectJ dans votre projet, vous trouverez peut-être l'approche suivante plus simple:

Enveloppez votre instance ComboPooledDataSource dans un non -infinal instance de classe de décorateur; cglib devrait être en mesure de substituer le décorateur sans être le plus sage.

En supposant - pour le bien de par exemple - que l'attribut dataSource de votre classe SampleDaoImpl est de type 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 

} 

fil dans le printemps comme ceci:

<bean id="sample_data_source" class="mystuff.ComboPooledDataSourceDecorator"> 
    <property name="delegate"> 
     <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     ... 
     </bean> 
    </property> 
</bean> 
+0

Cela a résolu mon problème - merci! cependant, je pourrais choisir le tissage AspectJ car certaines parties de l'application ne sont toujours pas couvertes par Spring. –