關於springboot項目中自動注入,可是用的時候值爲空的BUG

最近想作一些web項目來填充下業餘時間,首先想到了使用springboot框架,畢竟方便 快捷web

首先:去這裏 http://start.spring.io/ 直接構建了一個springboot初始化的項目框架  redis

而後:在頁面上選擇相應的依賴包,而後點擊構建按鈕,而後下載而且導入IDE中,目前喜歡使用IDEAspring

因而一個簡答的springboot項目就搭建好了springboot

廢話說完,而後想體驗下spring中redis的使用;框架

那就直接新建了一個類,而後 @Autowired 自動注入 RedisTemplate 類,固然在這個類上面是要加上 @Component 註解的。工具

可是問題來了,在這個類下面建立了一個方法,而後方法裏面調用redisTemplate的時候,提示爲null,這是爲何呢?對象

下面是嘗試了各類網上分享的解決方案中認爲比較有用的幾種方式:繼承

  1.註解沒有掃描到,問題緣由多是springboot啓動類沒有放到最外層的包的根目錄下面get

由於springboot啓動的時候會自動掃描啓動類所在包的全部子包裏面包含的註解,若是啓動類放錯了位置,會致使註解掃描不到io

具體邏輯,請看 

@SpringBootApplication 註解中包含的 @ComponentScan 這個註解的解析,就是掃描註解的一些邏輯

  2.調用的時候,使用的對象是被new出來的,而不是spring自動注入進來的,沒有被spring來管理,因此固然爲null

好比:在類 A裏面 注入了 redisTemplate  而後,springboot項目啓動以後在A類裏面又建立了一個 main方法,而後在main裏面,new A(); 來建立一個A的實例,而後再A.redisTemplate 進行調用,獲取到的就是一個NULL值

 

 

故:解決方式就是 若是想要使用 @Autowired注入一些springboot自動管理的工具的話,好比 redisTemplate  /  jdbcTemplate  等等,要麼就是直接在啓動類裏面進行注入,不過這樣用的比較少,通常都會新建一個類,而後在裏面進行注入,

可是若是想要使用的話須要繼承這個類,而後再子類中進行使用,好比使用redisTemplate  和  jdbcTemplate 的話,就能夠建立一個 DataSourceConfig 類,而後自動注入  redisTemplate  和  jdbcTemplate 而後新建兩個方法, getRedisTemplate()  和 getJdbcTemplate()  

裏面對應的返回相應的 template ,而後在 dao 中使用的時候就能夠直接繼承 DataSourceConfig  ,而後直接使用  getRedisTemplate()    和 getJdbcTemplate()  這兩個方法,來獲取到redis 和jdbcTemplate 進行數據的操做

 

 

以上僅爲本人最近遇到的一個比較無語的bug解決以後的備忘,之後勿犯

可是若是剛接觸springboot的話,可能會遇到此類問題,歡迎一塊兒探討

若有幫助到後來人,則功德無量

相關文章
相關標籤/搜索