ComponentScan的订单是否重要?

时间:2014-06-16 18:20:51

标签: spring spring-data spring-data-jpa spring-boot

我正在使用注释设置一个非常小的Spring / REST / JPA项目。

当我将我的JPA存储库类移到另一个包并在其包上调用componentscan时,我的REST控制器类中有一个具有Autowired存储库变量的Bean未找到错误。但是,当我的所有文件(总共5个)都在同一个包中时,一切正常。

所以我想知道,如果组件扫描顺序很重要,那么不太可能?例如,如果一个类是自动接线来自未经过“组件扫描”的包中的某些bean,那么是否会导致Bean找不到错误?

4 个答案:

答案 0 :(得分:2)

也许你需要分享一些代码。当你移动那些东西时,你还需要告诉Spring他们去了哪里。我的猜测是你没有定义@EntityScan@EnableJpaRepositories(默认为@EnableAutoConfiguration的位置)。

答案 1 :(得分:1)

可能有几个问题:

  • 您将类移出了没有参数的@ComponentScan的某个包。这基本上意味着组件仅在此包及其子代中进行扫描。因此,不扫描移动的类,并且没有要连接的bean。
  • @ComponentScan args中的包名错误。

订单根本不重要。有一个@Order注释,但它的目的更多的是以不同的顺序加载sth的多个实现。 首先创建Bean定义,它们与布线无关。然后通过bean post处理器注入自动装配的bean。由于没有bean定义。没有什么可以注入的。

答案 2 :(得分:1)

在结构良好的程序中则不会,因为首先实例化每个bean,然后自动装配它们,然后您才可以实际使用它们。

但是,在某些情况下,订单确实很重要,而我在弄清正在发生的事情时遇到了问题。因此,这是一个很重要的示例:

  1. 您有一些要首先填充数据的存储库,将其称为SetupData组件。
  2. 然后使用@PostConstruct保存默认对象。
  3. 您具有此存储库所依赖但不受Spring管理的某些组件,例如@Converter。
  4. @Converter依赖于您要静态注入的其他组件。

在这种情况下,@ PostConstruct方法将在自动组装到@Converter中的组件之前执行,这将导致异常。

依赖ComponentScan的顺序是一个坏习惯,因为它不直观,尤其是当您与可能不认识的多个人一起工作时。否则可能存在依赖性,您无法通过更改扫描顺序来修复代码。

在这种情况下,最好的解决方案是使用任务执行程序服务,该服务负责运行初始化功能。

答案 3 :(得分:0)

不,Spring加载所有配置信息,然后创建bean(尽可能多),然后在其他所有内容排成一行时将它们连接在一起。启动时将读取所有配置。