Moh*_*rmi 3 java webapp2 spring-boot component-scan
我在与配置类不同的包中有一个存储库,因此我使用@Repostiory 将其注释为以下内容:
package test;
@Repository
public interface UserTest extends JpaRepository<User, Long> {
}
Run Code Online (Sandbox Code Playgroud)
我已经对其进行了组件扫描,但没有奏效:
package com.app;
@SpringBootApplication
@ComponentScan({"test","com.app"})
public class Application extends SpringBootServletInitializer {
}
Run Code Online (Sandbox Code Playgroud)
例外:没有可用的“test.UserTest”类型的合格 bean:预期至少有 1 个 bean 有资格作为自动装配候选。
除非我添加 enableJpaRepositories ,否则为什么组件扫描不能在存储库上工作?我认为 componetScan 就足够了
更新:
由于某些答案提供了解决方案,我问的是解释而不是解决方案。以下内容甚至无需对“test”进行组件扫描即可工作:
SpringBootApplication
@EnableJpaRepositories({"test","com.app"})
public class Application extends SpringBootServletInitializer{
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是为什么我什至需要在 @Repository 上使用 componentscan 不起作用时?为什么在文档中@Repository 被componentscan 扫描时它没有效果并且@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 {
}
Run Code Online (Sandbox Code Playgroud)
更新:为什么需要@EnableJpaRepositories?
@SpringBootApplication 自动提供以下注解的特性
@Configuration @EnableAutoConfiguration @ComponentScan
但是,如果您尝试定义自己的注释,那么 spring boot 将不会处理内部自动配置,因此这就是我们必须启用存储库的原因。
我有一些项目,如果您不编写自己的东西,那么只有 @SpringBootApplication 就足够了。
我希望你明白这一点。
金字:
如果你想最大限度地利用spring boot的自动配置功能,最好把你所有的类包都放在spring boot主应用包下(直接放在主包中,或者间接作为子包)。
我找到了关于我做错了什么的解释。带有componentscan的@Repository注解不会导致spring实现spring jpa存储库。对于实现 CRUD 存储库的接口,应使用enablejparepository。
现在,当您有一个存储库类并且您有自己的 DAO 而不是 spring curd 存储库时,将 @Repository 与 Componentscan 一起使用,否则将不会创建实现:
@Repository
public class UserTest {
public List<Object> findById(long l) {
.......
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7048 次 |
| 最近记录: |