我正在使用注释设置一个非常小的Spring / REST / JPA项目。
当我将我的JPA存储库类移到另一个包并在其包上调用componentscan时,我的REST控制器类中有一个具有Autowired存储库变量的Bean未找到错误。但是,当我的所有文件(总共5个)都在同一个包中时,一切正常。
所以我想知道,如果组件扫描顺序很重要,那么不太可能?例如,如果一个类是自动接线来自未经过“组件扫描”的包中的某些bean,那么是否会导致Bean找不到错误?
答案 0 :(得分:2)
也许你需要分享一些代码。当你移动那些东西时,你还需要告诉Spring他们去了哪里。我的猜测是你没有定义@EntityScan
和@EnableJpaRepositories
(默认为@EnableAutoConfiguration
的位置)。
答案 1 :(得分:1)
可能有几个问题:
订单根本不重要。有一个@Order注释,但它的目的更多的是以不同的顺序加载sth的多个实现。 首先创建Bean定义,它们与布线无关。然后通过bean post处理器注入自动装配的bean。由于没有bean定义。没有什么可以注入的。
答案 2 :(得分:1)
在结构良好的程序中则不会,因为首先实例化每个bean,然后自动装配它们,然后您才可以实际使用它们。
但是,在某些情况下,订单确实很重要,而我在弄清正在发生的事情时遇到了问题。因此,这是一个很重要的示例:
在这种情况下,@ PostConstruct方法将在自动组装到@Converter中的组件之前执行,这将导致异常。
依赖ComponentScan的顺序是一个坏习惯,因为它不直观,尤其是当您与可能不认识的多个人一起工作时。否则可能存在依赖性,您无法通过更改扫描顺序来修复代码。
在这种情况下,最好的解决方案是使用任务执行程序服务,该服务负责运行初始化功能。
答案 3 :(得分:0)
不,Spring加载所有配置信息,然后创建bean(尽可能多),然后在其他所有内容排成一行时将它们连接在一起。启动时将读取所有配置。