1. 程式人生 > >關於springboot項目中自動註入,但是用的時候值為空的BUG

關於springboot項目中自動註入,但是用的時候值為空的BUG

cte 沒有 根目錄 原因 框架 初始化 工具 如果 config

最近想做一些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