站長留言

  • ✅ 本站維護及更新歷史紀錄,詳情請參考公告
  • ✅ 有任何意見、想法,歡迎留言給Spicy知道喔
  • ✅ 固定於每周一至周五更新Blogger文章,周末不定期
Design PatternJavaSpring

【Spring】Hibernate 和 Spring 的 Proxy

tags: Hibernate Spring

Common

  • 關鍵字: Spring, Hibernate, Proxy

Proxy object in hibernate



  1. Lazy Loading
    • DAO 透過 Hibernate 回傳的物件為 Persistent Object 的 Proxy
      • DAO: data access object 對映應用程式對持久層的呼叫
      • Persistent Object: 當物件與資料庫中的資料有對應關係,並且與Session 實例有關聯而Session 實例尚未關閉(close)
    • 解決辦法:lazy = false
  2. The Proxy doesn’t issue any SQL statement.
  3. 程式跟Proxy要資料
    • 在 session 尚未 close 前,先將資料塞到 Proxy,當session close 後,view 依然可以使用 Proxy 中的資料
    • 要不到時:LazyInitializationException
  4. annotation:直接在POJO上使用Annotation設定對映關係
    • POJO:Plain Old Java Object,簡單java對象,沒有繼承任何類、也沒有實現任何介面,更沒有被其它框架侵入的java對象 (does not follow any of the major Java object models, conventions, or frameworks)
    • package:javax.persistence
    • 例如:
      • @Entity
      • @Table(name = “TEST”)
      • @Id
      • @Column(name = “id”)

Spring with Hibernate

  1. Hibernat + ORM
    • Object/Relational Mapping
    • mapping:hibernate.cfg.xml
      • 利用sql生成資料庫
      • 利用hibernate tool生成orm
  2. initialize class
    • brick-platform.xml 設定要初始化的bean, class
    • auto scan,找該package底下的所有annotation,並設定bean
<context:component-scan base-package="olitglobal"></context:component-scan>
  1. 聲明Bean
    • spring beans are all in singleton scope by default

    • 以下4種Bean,本質上是相同的,只是為了區分不同功能

      Annotation Meaning
      @Component generic stereotype for any Spring-managed component 其他元件
      @Repository stereotype for persistence layer 持久層,ex:DAO
      @Service stereotype for service layer 服務層,業務邏輯
      @Controller stereotype for presentation layer (spring-mvc) 控制層
  2. 注入Bean
    • @Autowired
  3. Scope
    • Singleton:default
    • Prototype:每次都建立新的
  4. 交易屬性
    • @Transactional

Spring Proxy and AOP

Transactional



  • 設定檔 brick-platform.xml
<tx:annotation-driven transaction-manager="transactionManager" /> <context:component-scan base-package="olitglobal"></context:component-scan>
  • 只有啟動時Proxy才會存在,當應用程式停止時,Proxy也跟著destroy

  • proxy class本身不包含transaction的程式碼,他將transaction handling給其他Spring framework的某些class

  • 如果沒有介面可以實作,會直接用繼承的方式產生Proxy

  • 動態代理

    • JDK Reflection API:有實作interface
    • cglib:沒有實作interface
  • Synchronizing resources with transactions

// 方法1 autowired @Autowired private OpticalCableService opticalCableService; ... LOGGER.info(opticalCableService.getClass().getName()); // olitglobal.bp.optical.svc.OpticalCableService$EnhancerBySpringCGLIB$1784b26 // 方法2 applicationContext private OpticalCableService opticalCableService = SpringContext.getApplicationContext().getBean(OpticalCableService.class); LOGGER.info(opticalCableService.getClass().getName()); // olitglobal.bp.optical.svc.OpticalCableService$EnhancerBySpringCGLIB$34da3c12

AOP


  • 相較於OOP只能靜態的(Static)修改系統程式,AOP(Aspect-Oriented Programming,面向導向程式設計)不但允許軟體開發人員能做動態的修改,甚至不需修改原本靜態的Model
    • OOP不適合定義橫向關係,例如日誌功能,日誌代碼往往橫向地散佈在所有對象層次中,而與它對應的對象的核心功能毫無關係
    • 散佈在各處的無關的代碼被稱為橫切(cross cutting)
    • 導致了大量代碼的重複,而不利於各個模塊的重用

  • AOP:核心關注點和橫切關注點
    • 核心關注點:業務處理
    • 橫切關注點:權限認證、日誌

auto scan

  • auto scan:透過Annotation告訴Spring框架,底下的代碼是代表什麼,來減少重複的例行性程式碼
    • Inversion of Control - IOC:將控制權交到Spring的手上,讓Spring管理程式中的Bean,藉由控制關係的轉移,可以獲得元件的可重用性,應用程序組件的配置和Java對象的生命週期管理
    • Dependency Injection - DI:為實現IOC的手段之一,讓Spring能夠自動創建所需的Bean,並注入到需要這些Bean的地方
  • IOC
    • constructor
    • setter
    • annotation 是 constructor, setter?

Reference

  1. Spring with Hibernate Transaction by Proxy
  2. https://xebia.com/blog/advanced-hibernate-proxy-pitfalls/
  3. https://www.topjavatutorial.com/frameworks/hibernate/hibernate-annotations/
  4. https://dotblogs.com.tw/una/2018/02/20/141448
  5. https://blog.csdn.net/KingCat666/article/details/76911704
  6. http://www.dotspace.idv.tw/Book/chap4.pdf
  7. https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring
  8. https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html
  9. Spring 4.3.x 官方文件
  10. Spring 4.x 中文

沒有留言:

張貼留言

本網站建議使用電腦或平板瀏覽