2014-02-26 45 views
0

在Java項目中,我們有一個包含許多方法脂肪服務類:我應該將該方法從服務移至其自己的類,還是不?

@Service 
@Transaction 
public class FatService { 

    @Autowired 
    private FatRepository fatRepository; 

    public void doSomethingSpecial() { 
     // complex logic 
     fatRepository.save(foo); 
     fatRepository.save(bar); 
    } 

    public void doSomething1() {} 
    public void doSomething2() {} 
    public void doSomething3() {} 
    public void doSomething4() {} 
    public void doSomething5() {} 
    public void doSomething6() {} 
    public void doSomething7() {} 
    public void doSomething8() {} 

} 

此服務旨在提供對代碼庫的所有類事務邊界。它有一些數據庫操作。如果我們關心交易,我們只需要維護這個類。

但它很胖,我發現有一些方法只用於其他單個類,例如, doSomethingSpecial(),它只有在Special課堂上使用:

@Component 
class Special { 
    @Autowired 
    private FatService fatService; 

    doSomething() { 
     // do something first 

     fatService.doSomethingSpecial(); 

     // do something last 
    } 
} 

我不喜歡的邏輯分爲兩個不同類別,所以我移動doSomethingSpecial()方法從FatServiceSpecial

@Component 
class Special { 
    @Autowired 
    private FatService fatService; 

    doSomething() { 
     // do something first 

     doSomethingSpecial(); 

     // do something last 
    } 

    @Transactional 
    private doSomethingSpecial() { 
     // this method is move from FatService 
     fatService.save(foo); 
     fatService.save(bar); 
    } 
} 

公告我仍然在方法doSomethingSpecial上保留@Transactional註釋。還添加了save方法FatService

public void save(Object obj) { 
    fatRepository.save(obj); 
} 

但我的同事說,我不應該將其移動到Speical,因爲我們有兩個不同的類,這使得代碼難以維持,如果交易展開到的管理事務所有的代碼庫。

我想知道什麼是最佳解決方案?

  1. 我不想邏輯分成不同的類,只是因爲交易
  2. 我仍然希望交易管理容易

回答

2

基本上都涉及一個數據庫事務的典型應用。因此,除非您的應用程序是一個小玩具應用程序,否則將每個交易方法放在一個類中是不可管理的:您最終會得到一個包含數百或數千個方法的類。如果你有一個分層的應用程序,無論如何,每一個服務都應該是事務性的,而且這隻需要一個註釋,所以沒什麼可管理的。

這就是說,你的重構有一個嚴重的錯誤:儘管Special.doSomethingSpecial()方法被註釋爲事務性的,但事實上並不是這樣,因爲它是直接從同一類的另一個方法調用的私有方法。所以事務性Spring攔截器不能攔截方法調用並處理事務。簡而言之,@Transactional只有在Spring bean調用時纔有效 Spring bean。

+0

謝謝但很抱歉,我無法理解第一段。你同意提供單一的服務類或幾個服務類嗎?我們是否需要將交易始終保持在服務層? – Freewind

+0

第一段說的是,將所有transactionsl方法放在一個類中並不能縮放:最終會有數百個方法在一個類中。所以很顯然,你應該有幾個事務性的服務類。 –

+0

現在清除,謝謝:) – Freewind

0

胖子的服務可能是你的業務責任分開的不清楚,你應該重新思考有界的上下文,將胖子的服務分解到不同的上下文中,並根據無處不在的語言重命名服務。不建議將方法轉化爲特殊類,它會讓服務像嗜毒止渴的層層無意義。

相關問題