1. 程式人生 > >@Component、@Controller、@Service、@Repository各自的掃描存在優先順序嗎?

@Component、@Controller、@Service、@Repository各自的掃描存在優先順序嗎?

    該問題的提出是出於好奇,雖然說似乎從功能上大致是相同的,畢竟他們之間也是存在差異的,在進行經典網路三層架構(servlet、service、dao)的簡單模擬的過程中,使用了AOP程式設計思想,對事務進行了單獨的織入,如圖所示:

 其中,

  • 包aspect和包TransactionManager為AOP程式設計
  • 包dao為DAO層
  • 包pojo為javaBean
  • 包ser為DAO層

  這裡面我使用了implements BeanNameAware來觀察執行的情況,現在問題來了,使用註解@Component、@Controller、@Service、@Repository,包掃描的順序如何?上圖顯示的先後順序是:

  1. userDaoImpl
  2. userServiceImpl

   問題來了包掃描是根據什麼來的呢?應該不會按照業務邏輯進行先後,是根據字母排序嗎?之前只有兩個類實現了BeanNameAware,因此我再加一些進行嘗試:

看樣子還真是很像按照字母進行排序的,繼續新增:

   這次似乎不太合理了,因為txAspect的首字母為t應該比u小的,這種猜測被否定了那又是按照什麼來的呢、突然想起來XML檔案裡給了一個包掃描的順序:

<context:component-scan base-package="pojo,dao,service,web,tx,aspect"/>

我去,這完全一致嘛,應該就是這個了,不過為了保險起見,還是需要把所有的都進行實現介面看看:

這裡面幾乎完全符合,不過仔細發現user不應該在最後進行載入呀!於是我打算調整一下XML檔案中的順序:

<context:component-scan base-package="tx,pojo,dao,service,web,aspect"/>

  我們發現,tx跑到最前面去了,跟XML裡面的順序完全一致,那我的user為什麼會最後進行載入呢?仔細一看恍然大悟,原來是自己在user掃描前加了懶載入:

 小結:試驗證明,@Component、@Controller、@Service、@Repository進行包掃描不存在優先順序,除非存在方法的註解疊加使用,比如本文的懶載入!