簡體   English   中英

Spring @ComponentScan在@Repository上不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM