2013-06-26 2 views
2

Je voudrais savoir si quelqu'un a de l'expérience avec la configuration d'un haricot au printemps avec un intercepteur qui déclenche automatiquement un événement lorsqu'une propriété est modifiée.Écouteur de changement d'attribut de classe avec Spring

public class DTO { 
    public String a;  
} 

public class Listener() { 
    public void objectChanged(Object ob) { 
     System.out.println("Object changed"); 
    } 
} 

En ce qui concerne les classes plus, si je fais ce qui suit.

public static void main(String args[]) { 
    DTO ob = AppContext.getBean(DTO.class); 
    ob.a = "new value"; 
} 

Ce que je veux arriver ici est que l'auditeur fonction objectChanged se déclenche automatiquement au printemps quand une propriété est modifiée sur l'objet DTO. Où vais-je trouver des informations à ce sujet? et est-ce possible?

+0

Qu'en est-il de l'utilisation des méthodes setter/getter? –

+1

Getter et setters sont ok, mais cela nécessite que j'ajoute une ligne de code pour chaque setter, comme "objectIsDirty". J'espérais quelque chose de plus élégant;) – user1051218

+0

Vous devez prendre l'habitude d'utiliser des accesseurs get/set. C'est une mauvaise habitude d'accéder à la propriété directement à sa variable. Eclipse a un moyen automatisé de propager les accesseurs get/set en fonction d'une gamme de variables. –

Répondre

0

Comme le demande @DaDaDom, pourquoi voulez-vous éviter les getters/setters? Je ne pense pas que votre idée est possible, mais il pourrait être fait en utilisant AOP d'une manière similaire à

<aop:aspectj-autoproxy/> 

<aop:config> 
    <aop:pointcut id="yourcut" expression="execution(* your.dto.package.*.set*(..))" /> 
    <aop:advisor advice-ref="attribChangedAdvice" pointcut-ref="yourcut" /> 
</aop:config> 

<bean id="attribChangedAdvice" class="your.package.YourListener"> 
    ... 
</bean> 

Vous pouvez alors placer l'auditeur l'objet modifié dans la file d'attente pour l'insertion/mise à jour du DB. En sauvegardant la file d'attente avec une sorte de carte, vous pouvez même optimiser en remplaçant deux fois les objets modifiés avant qu'ils ne soient insérés.

Cheers,

+0

Pour plus de clarté, il s'agit d'objets de données stockés dans une base de documents. Donc, mon idée était que ces objets pourraient être automatiquement enregistrés dans la base de données lorsqu'ils sont modifiés. Ils sont supposés être identiques dans la mémoire car ils sont stockés dans la base de données mongodb. aujourd'hui ils sont stockés en invoquant manuellement la saveObjectToDatabase. Espérait faire 100% automagically. :) – user1051218

+0

Problème et approche intéressants. Pourtant, je pense que la programmation d'aspect pourrait fonctionner, mais cela dépend beaucoup du nombre de transactions que vous attendez; il pourrait facilement se casser sous la charge en raison d'un grand nombre de procurations de classe. –

Questions connexes