以前一直覺得Hibernate
獨立於Spring
,Hibernate
相關的攔截器、監聽器都不能注入Spring
容器對象,最近發現這個觀點是錯誤的。java
Hibernate
能夠注入Spring
容器對象,只是repository
的建立順序緣由,使得對象注入失敗。spring
User
實體:數據庫
@Entity @EntityListeners(PasswordEncodeListener.class) public class User { }
實體監聽器:架構
@Component public class PasswordEncodeListener { @Autowired private UserRepository repository; @Autowired private JdbcTemplate jdbcTemplate; @Autowired private UserService userService; @Autowired private NoRepoService noRepoService; @PrePersist public void encode(User user) { System.out.println(repository); System.out.println(jdbcTemplate); System.out.println(userService); System.out.println(noRepoService); } }
執行保存用戶的方法,打印結果:code
null null null null
因此以前得出了錯誤的結論,認爲Hibernate
獨立於Spring
,沒法使用Spring
容器內的對象。對象
修改監聽器,去除對倉庫的依賴,包括去除直接依賴倉庫的UserRepository
與間接依賴倉庫的UserService
。it
@Component public class PasswordEncodeListener { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private NoRepoService noRepoService; @PrePersist public void encode(User user) { System.out.println(jdbcTemplate); System.out.println(noRepoService); } }
再執行保存用戶的方法,結果以下:io
org.springframework.jdbc.core.JdbcTemplate@7e9f2c32 club.yunzhi.jpa.service.NoRepoServiceImpl@3976ebfa
更新以前的錯誤觀點:class
Hibernate
的監聽器、攔截器並非獨立於Spring
的,而是由於若是直接或間接依賴了倉庫,由於建立的順序問題,會致使全部對象注入失敗。若是不依賴於倉庫,對象能夠注入成功。
因此在Hibernate
內操做數據庫就有了兩種方案:容器
第一種就是咱們過去的ApplicationContextHolder
,靜態方法獲取context
,手動獲取倉庫對象。
第二種方案就是基於此次的新發現,能夠注入JdbcTemplate
,進行數據庫的操做。
雖然我總結的錯誤結論並不影響平常的使用,可是認爲仍是有必要進行糾正,你們之後都會是優秀的技術員、架構師,不但願由於個人一個錯誤結論,讓你們在之後成長的道路上遇到困難。