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

其中,
- 包aspect和包TransactionManager為AOP程式設計
- 包dao為DAO層
- 包pojo為javaBean
- 包ser為DAO層
這裡面我使用了implements BeanNameAware來觀察運作的情況,現在問題來了,使用注解@Component、@Controller、@Service、@Repository,包掃描的順序如何?上圖顯示的先後順序是:
- userDaoImpl
- 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掃描前加了懶加載: