關於springboot項目中自動註入,但是用的時候值為空的BUG
最近想做一些web項目來填充下業余時間,首先想到了使用springboot框架,畢竟方便 快捷
首先:去這裏 http://start.spring.io/ 直接構建了一個springboot初始化的項目框架
然後:在頁面上選擇相應的依賴包,然後點擊構建按鈕,然後下載並且導入IDE中,目前喜歡使用IDEA
於是一個簡答的springboot項目就搭建好了
廢話說完,然後想體驗下spring中redis的使用;
那就直接新建了一個類,然後 @Autowired 自動註入 RedisTemplate 類,當然在這個類上面是要加上 @Component 註解的。
但是問題來了,在這個類下面創建了一個方法,然後方法裏面調用redisTemplate的時候,提示為null,這是為什麽呢?
下面是嘗試了各種網上分享的解決方案中認為比較有用的幾種方式:
1.註解沒有掃描到,問題原因可能是springboot啟動類沒有放到最外層的包的根目錄下面
因為springboot啟動的時候會自動掃描啟動類所在包的所有子包裏面包含的註解,如果啟動類放錯了位置,會導致註解掃描不到
具體邏輯,請看
@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的話,可能會遇到此類問題,歡迎一起探討
如有幫助到後來人,則功德無量
關於springboot項目中自動註入,但是用的時候值為空的BUG