上學期學完spring的基本增刪改查後,還曾有點小小的得意,感受本身也算知道很多的編程知識了,但這段時間的項目經驗又一次次的教了本身作人,不斷出現的新知識讓本身應接不暇,知道的越多,未知的越多。spring
也算進入了學習的另外一個階段:數據庫
知道本身不知道
感慨完了,該進入正題了,本週有一個需求,spring sercurity要求在保存密碼的時候密碼必須加密,學長開始寫的時候是在setter密碼的時候調用加密方法,不夠優雅,就讓我把這個方法提出來,換用監聽器,當監聽的user保存時就自動加密其密碼,因爲當時只知道攔截器,因而就去找了一篇攔截器的教程,發現寫出來感受至關不合適,就問學長,果真我理解錯了意思,是用一個叫實體監聽器(Entity Listeners)的東西。編程
顧名思義,它能夠監聽實體的某些行爲,並進行一部分操做。學習
Executed before the entity manager persist operation is actually executed or cascaded. This call is synchronous with the persist operation.
在數據持久化到數據庫以前執行加密
Executed before the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
執行數據刪除以前調用spa
Executed after the entity manager persist operation is actually executed or cascaded. This call is invoked after the database INSERT is executed.
在執行數據插入以後調用hibernate
Executed after the entity manager remove operation is actually executed or cascaded. This call is synchronous with the remove operation.
在執行數據刪除以後調用code
Executed before the database UPDATE operation.
在執行數據更新以前調用對象
Executed after the database UPDATE operation.
在執行數據更新以後調用繼承
Executed after an entity has been loaded into the current persistence context or an entity has been refreshed.
在數據從數據庫加載而且賦值到當前對象後調用
首先,先定義一個操做用的類,並在其中寫下你要用的方法,好比下面的方法就表明在用戶持久化和更新的時候執行(只需註解就好,不用繼承其餘類)。
而後在實體上聲明,就完工了,至關簡單。
對於上面的代碼,初學者可能會對這一段有疑惑
PasswordEncoder passwordEncoder = ContextConfig.getContext().getBean(PasswordEncoder.class);
我開始也不明白,仍是學長給我講解的,這是獲取PasswordEncoder的對象,學長給我講了講才大概明白了hibernate和spring是兩個系統,spring管理的對象,hibernate注入不進來。若是不明白能夠看看下面這個圖。
這篇文章寫得挺不錯,有興趣能夠看看。
實體監聽器雖然只是一個很簡單的功能,但卻很是強大與實用,這段時間以來同時瞭解到hibernate和spring並非一個東西,之前一直覺得hibernate是spring的一個小功能,同時對spring總算有了一丁點清晰的認識,整體狀態還算滿意,感謝學長們的幫助。