天天看點

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

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

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

 其中,

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

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

  1. userDaoImpl
  2. userServiceImpl

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

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

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

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

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

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

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

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

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

<context:component-scan base-package="tx,pojo,dao,service,web,aspect"/>
           
@Component、@Controller、@Service、@Repository各自的掃描存在優先級嗎?

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

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

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

繼續閱讀