[英]Spring @ComponentScan doesn't work on @Repository
我有一個與配置類不同的包中的存儲庫,因此我用@Repostiory對其進行了如下注釋:
package test;
@Repository
public interface UserTest extends JpaRepository<User, Long> {
}
我已經對其進行了組件掃描,但沒有成功:
package com.app;
@SpringBootApplication
@ComponentScan({"test","com.app"})
public class Application extends SpringBootServletInitializer {
}
異常:沒有類型為'test.UserTest'的合格Bean:至少應有1個有資格作為自動裝配候選的Bean。
除非我添加enableJpaRepositories,否則組件掃描為什么不能在存儲庫上工作? 我以為componetScan就足夠了
更新 :
由於一些答案提供了解決方案,我問的是解釋而非解決方案。 即使不對“ test”進行組件掃描,也可以執行以下操作:
SpringBootApplication
@EnableJpaRepositories({"test","com.app"})
public class Application extends SpringBootServletInitializer{
}
現在的問題是,為什么當我無法使用@Repository時我什至需要使用componentscan? 為什么在文檔中@Repository無效時組件可以掃描@Repository並且@EnableJpaRepostiories是enoguh?
來自Spring文檔上有關組件掃描的內容:指示是否應啟用對以@Component @ Repository,@ Service或@Controller注釋的類的自動檢測。
在我的情況下未檢測到@Repository
為了讓spring知道什么DataSource與哪個Repository相關,您應該在@EnableJpaRepositories
批注中定義它。
嘗試啟用如下所示的jpa存儲庫。
@SpringBootApplication
@ComponentScan({"test","com.app"})
@EnableJpaRepositories("test")
public class Application extends SpringBootServletInitializer {
}
更新:為什么需要@EnableJpaRepositories?
@SpringBootApplication自動提供以下注釋的功能
@Configuration @EnableAutoConfiguration @ComponentScan
但是,如果您嘗試定義自己的注釋,那么spring boot不會處理內部自動配置,因此這就是我們必須啟用存儲庫的原因。
我有一些項目,如果您不編寫自己的東西,僅使用@SpringBootApplication就足夠了。
我希望你明白了。
黃金字:
如果您想最大程度地利用spring boot的自動配置功能,可以將所有類包都放在spring boot主應用程序包下(直接放在主包中或間接作為子包)。
我找到了關於我做錯了事情的解釋。 具有組件的@Repository批注不會導致spring實施spring jpa存儲庫。 對於實現Crud存儲庫的接口,應使用enablejparepository。
現在,將@Repository與componentscan一起使用是當您擁有一個存儲庫類並且您有自己的DAO 而不用於spring curd repo時,否則將不會創建實現:
@Repository
public class UserTest {
public List<Object> findById(long l) {
.......
}
}
您應該像下面那樣使用您的代碼,因為@ComponentScan始終與基本軟件包一起使用,因此您的實現應如下所示。
package com.app;
@SpringBootApplication
@ComponentScan(basePackages={"test","com.app"})
@EnableJPARepositories
public class Application extends SpringBootServletInitializer {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.