關於spring boot自動注入出現Consider defining

關於spring boot自動注入出現Consider defining a bean of type 'xxx' in your configuration問題解決方案

搭建完spring boot的demo後天然要實現自動注入來體現spring ioc的便利了,可是我在實施過程當中出現了這麼一個問題,見下面,這裏找到解決辦法記錄下來,供遇到一樣的問題的同僚參考 
  spring

Description:

Field helloService in com.example.demo.service.TestController required a bean of type 'com.example.service.HelloService' that could not be found.


Action:

Consider defining a bean of type 'com.example.service.HelloService' in your configuration.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  而後我又看了下本身寫的幾個類以及註解見下面,感受寫的沒有問題啊 
  控制器 TestController 
  這裏寫圖片描述 
  接口HelloService 
  這裏寫圖片描述 
  接口對應的實現類HelloServiceImpl 
  這裏寫圖片描述 
   
  根據英文的提示是在配置中找不到一個指定自動注入類型的bean,通過多方排查得出結論: 
  正常狀況下加上@Component註解的類會自動被Spring掃描到生成Bean註冊到spring容器中,既然他說沒找到,也就是該註解被沒有被spring識別,問題的核心關鍵就在application類的註解SpringBootApplication上 
  這裏寫圖片描述
  這個註解其實至關於下面這一堆註解的效果,其中一個註解就是@Component,在默認狀況下只能掃描與控制器在同一個包下以及其子包下的@Component註解,以及能將指定註解的類自動註冊爲Bean的@Service@Controller和@ Repository,至此明白問題所在,以前我將接口與對應實現類放在了與控制器所在包的同一級目錄下,這樣的註解天然是沒法被識別的 
  app

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters={@Filter(type=CUSTOM, classes={TypeExcludeFilter.class}), @Filter(type=CUSTOM, classes={AutoConfigurationExcludeFilter.class})})
@Target(value={TYPE})
@Retention(value=RUNTIME)
@Documented
@Inherited
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  至此,得出兩種解決辦法: 
  1 .將接口與對應的實現類放在與application啓動類的同一個目錄或者他的子目錄下,這樣註解能夠被掃描到,這是最省事的辦法 
  2 .在指定的application類上加上這麼一行註解,手動指定application類要掃描哪些包下的註解,見下圖 
  這裏寫圖片描述
   
  經過這兩種方式,那個找不到指定Bean的錯誤就成功解決了。。。。。那麼這篇就這樣吧 
  PS:控制器Controller也要放在與application同級或者子目錄下,道理大體同樣ide

相關文章
相關標籤/搜索