使用ComponentScan

时间:2017-11-30 12:41:40

标签: java spring spring-boot

我正在尝试创建项目结构,允许我通过简单地在类路径上添加/删除模块。在我的Spring应用程序中使用@ComponentScan("com.companyname")注释,它可以从模块中检测并创建带注释的组件。但是当我尝试在任何地方自动装载我的CrudRepository时,我会遇到错误:

Field repo in com.companyname.somemodule.services.SomeService required a bean of type 'com.companyname.somemodule.repos.SomeRepo' that could not be found.

所以我认为,如果它们在一个模块中定义,它可能以某种方式无法创建回购,所以我没有提前并将测试回购添加到我的基础SpringApplication中,令我惊讶的是我得到了:

Field repo in com.companyname.modularapp.TestService required a bean of type 'com.companyname.modularapp.TestRepo' that could not be found.

然后我刚删除了我的@ComponentScan注释,突然TestRepo按照我的意图工作,我能够坚持并正常阅读测试实体。因此,显然ComponentScan会以某种方式搞砸CrudRepository的创建,或者稍后检测它。

我像这样定义我的回购:

@Entity
public class Test {
    @Id
    private long id;
}

public interface TestRepo extends CrudRepository<Test, Long>{}

我正在尝试使用这个项目的Spring Boot 2.0.0.M7,但我怀疑这是原因。 我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

您还可以通过以下方式定义存储库扫描包:

@EnableJpaRepositories("com.companyname")

或在XML配置中

<jpa:repositories base-package="com.companyname"/>

答案 1 :(得分:0)

如果您使用的是spring-boot,您可以删除@ComponentScan注释,因为@SpringBootApplication注释中已经定义了注释。也许他们之间存在某种冲突,如果不看代码就很难说清楚。

答案 2 :(得分:0)

如果您在项目中自定义程序包扫描,那么您可能需要手动配置需要扫描路径的bean,例如:对于JPA,您可以创建自己的LocalContainerEntityManagerFactoryBean bean(您可以在此处找到自动配置示例 -  org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration#entityManagerFactory - 来自spring-boot 1.5。*)的类链接。 但是,如果您不需要包扫描自定义,只需在项目根目录中使用@SpringBootApplication注释类,并将其传递给spring :: run方法。