情景:在使用SpringMVC的定時任務的注解時,發現自己的定時任務會重復執行倆次。這是為什么呢?
java代碼:

spring-mvc.xml配置:


這樣配置完后,在啟動項目后,項目便能按照指定的時間,間隔半小時執行一次。任務是沒半小時執行了,但是每次會重復倆次插入操作。這讓我有些費解了。我上網搜索了一下類似的情況的前輩們的解決方法,然后才知道原因。
原因:
任務在同一時刻執行了倆次,說明這個任務實例化了倆次。我看到網上大多數都是寫的原因都是因為SpringMVC的配置文件,因為在web.xml中也引入了該文件而被實例化了倆次。原文如下:

但是我總是覺得這個理由不適合我的情況。如果是因為在web中配置而導致實例化了倆次的話,那么其他的用@Component等注解的類,不也會實例化倆次嗎?但是我並沒有發現其重復實例化的現象。那么說明,我的項目程序的配置沒有問題。那么是什么原因導致我的定時任務被實例化了倆次呢?偶然間看到一個微博上寫的,如果太多配置寫在一個.xml文件中,會導致在掃描的時候,重復實例化。原作者語言如下:(以作日后參考)

偶然間我鼠標放在了配置文件的一個標簽component-scan屬性上,我恍然大悟:


component-scan:掃描標簽會自動將擁有@Component注解的類實例化為Bean,而在我定義的任務類上恰好有這么個標簽!而在項目中,這個標簽早就已經引入使用了,而我再定義了一個,那么就相當於將擁有@Component注釋的類實例化了倆次。即使掃描的包不同,但是先前定義的掃描范圍可是整個項目的。這樣一來,我的這個任務類相當於被實例化了倆次。那么,直接把這個掃描配置刪了,不就成了?
解決:
我直接將配置文件中我自己定義的那個自動掃描包的配置:
刪除,然后測試,果然,任務只執行了一次。到此,問題解決!
參考來源:
http://blog.csdn.net/chaijunkun/article/details/6925889
總結:
雖然在開發的時候用springMVC用的很多,但是對於spring的種種功能和配置,我還是很糊塗的。這也說明了我springMVC基礎知識的薄弱性。springMVC的學習有待加強啊!
解決此類問題:
1)看配置文件是否有問題:這里的配置文件指的是web.xml和spring-mvc間的配置,是否會導致實例化重復,如果有,就直接修改配置就行;
2)除開1)的情形,即web配置不會導致重復實例化的話,那么就看spring-mvc.xml中的掃描配置是否有重疊的地方,如果有,將重疊的地方去掉就行。
