SpringBoot 中的配置顺序

2022-09-01 22:55:26

我试图理解我们使用的bean如何倾向于覆盖默认情况下由SpringBoot生成的bean。我一直在做一个项目,在许多情况下,我们为ZuulConfigs之类的东西创建bean,假设是,无论我们做什么,都应该优先于默认生成的bean。我一直试图弄清楚这一点,但不能。基本上@Configuration

  1. Spring是否通过一些自定义类加载器实现了这一点
  2. 如果不是,这个优先级是如何工作的。我能不能以类似于我的豆子的方式给予一些优先权
  3. 我可以在我的项目中生成类似的层次结构,如果是这样,如何

非常感谢您的帮助


答案 1

Spring 自动配置用于提供基本配置(如果某些类是否在类路径中)。

如果要配置弹簧实例化豆子的顺序,可以使用

@DependsOn("A") 
 public class B {
 ...    
}

这将创建豆“A”,然后是“B”。因此,您可以根据豆类需要首先完成来订购配置。无论如何,Spring通过分析bean类来自动检测依赖关系。有关更多帮助,请检查此问题 春季启动自动配置顺序

替代:还有“@AutoConfigureOrder”注释(您可以在其中确定配置的优先级),您可以查看代码以更深入地了解。

自动配置的文档在这里


答案 2

首先,类加载和bean创建是两回事。我们不需要创建一个bean来加载一个类,但是,为了创建一个bean,必须加载一个类。

现在,回到Spring的例子,Spring查看了所有由 和/or 注释的类所配置的所有包,并创建了所有类的bean。Spring的容器会跟踪所有创建的bean,因此,当它遇到与默认Bean具有相同名称和类类型的用户定义bean时,它会用用户定义的bean替换原始定义(例如,我们可以创建自定义来覆盖Spring boot自己的实例)。您还可以使用注释来使 Bean 在存在具有相同类的另一个定义时优先(此处的文档)。@componentScan@Bean@Configuration@Component@ObjectMapper@Primary

以下是您问题的答案:

  1. Spring 使用反射来加载类并创建实例。尽管您可以使用自定义类装入器装入类(此处有更多介绍),但您不必担心 。@Configuration
  2. 是的,您可以使用注释来为 Bean 指定优先级。您还可以使用(此处)来定义 Bean 的创建顺序。@Primary@Order
  3. 使用 和 注释,您可以定义自己的层次结构以创建 Bean。@Primary@Order@Qualifier

推荐