Spring @ComponentScan在@Repository上不起作用

时间:2018-11-06 12:53:46

标签: java spring-boot webapp2 component-scan

我的存储库与配置类不同,因此我用@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够了


更新

由于某些答案提供了解决方案,因此我要求提供的解释不是解决方案。甚至无需在“测试”上进行组件扫描即可执行以下操作:

SpringBootApplication
@EnableJpaRepositories({"test","com.app"})
public class Application extends SpringBootServletInitializer{
}

现在的问题是,为什么当我无法使用@Repository时我什至需要使用componentscan?为什么在文档中@Repository不起作用并且@EnableJpaRepostiories是enoguh时被组件扫描?

从Spring文档中有关组件扫描的内容: 指示是否应启用对以@Component @ Repository,@ Service或@Controller注释的类的自动检测。

在我的情况下,未检测到@Repository

3 个答案:

答案 0 :(得分:1)

为了让spring知道哪些DataSource与哪些Repository相关,您应该在@EnableJpaRepositories批注中对其进行定义。

尝试启用如下所示的jpa存储库。

@SpringBootApplication
@ComponentScan({"test","com.app"})
@EnableJpaRepositories("test")
public class Application extends SpringBootServletInitializer {
}

更新:为什么需要@EnableJpaRepositories?

@SpringBootApplication自动提供以下注释的功能

@配置 @EnableAutoConfiguration @ComponentScan

但是,如果您尝试定义自己的注释,那么spring boot不会处理内部自动配置,因此这就是我们必须启用存储库的原因。

我有一些项目,如果您不编写自己的东西,那么仅@SpringBootApplication就足够了。

我希望你明白了。

金字:

如果您想最大程度地利用spring boot的自动配置功能,可以将所有类包都放在spring boot主应用程序包下(直接放在主包中或间接作为子包)。

答案 1 :(得分:1)

我找到了关于我做错事情的解释。具有组件的@Repository批注不会导致spring实施spring jpa存储库。应当使用实现crud仓库的接口enablejparepository。

现在,当您拥有一个存储库类并且拥有自己的DAO时,将@Repository与componentscan一起使用不适用于spring curd repo ,否则将不会创建实现:

@Repository
public class UserTest {


    public List<Object> findById(long l) {

             .......
    }
}

答案 2 :(得分:0)

您应该像下面那样使用您的代码,因为@ComponentScan始终与基本软件包一起使用,因此您的实现应如下所示。

 package com.app;
    @SpringBootApplication
    @ComponentScan(basePackages={"test","com.app"})
    @EnableJPARepositories 
    public class Application extends SpringBootServletInitializer {
    }