2013-06-26 155 views
2

我想知道是否有人在彈簧中設置bean的經驗,使用一個攔截器,該攔截器會在屬性發生更改時自動觸發事件。Spring屬性更改偵聽器

public class DTO { 
    public String a;  
} 

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

關於到班了,如果我這樣做。

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

我想在這裏發生的是,聽衆objectChanged功能時財產被DTO的對象上的改變是由彈簧自動閃光。我在哪裏可以找到關於這方面的信息?這有可能嗎?

+0

如何使用setter/getter方法? –

+1

Getter和setters都可以,但是這要求我爲每個setter添加一行代碼,比如「objectIsDirty」。我希望有更優雅的東西;) – user1051218

+0

你需要養成使用get/set訪問器的習慣。直接訪問其變量是一種壞習慣。 Eclipse提供了一系列變量來自動傳播get/set訪問器。 –

回答

0

正如@DaDaDom所問,你爲什麼想要避開獲取者/設置者?我不認爲你的想法是可行的,但它可以在類似的方式使用AOP做才能

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

然後,您可以有聽衆將改變的對象在隊列中插入/更新到數據庫。使用排序映射備份隊列,甚至可以通過在插入之前替換兩次修改的對象來進行優化。

乾杯,

+0

爲了澄清,這是存儲在文檔數據庫中的數據對象。所以我的想法是,這些對象可以在更改時自動保存到數據庫中。它們存儲在mongodb數據庫中的內存應該是相同的。 今天它們通過手動調用saveObjectToDatabase進行存儲。希望能夠做到這一點100%自動。 :) – user1051218

+0

有趣的問題和方法。儘管如此,我認爲方面編程可能會起作用,但很大程度上取決於您期待的事務數量;由於大量的類代理,它可能很容易在負載下崩潰。 –

相關問題