如果没有设置profile,将加载哪个bean?

jum4pzuy  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(263)

测试以下Spring外形:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="bean1"
          class="com.Test2">
    </bean>

    <beans profile="DEV">

    <bean id="bean1"
          class="com.Test1">
    </bean>

    </beans>

    <bean id="bean1"
          class="com.Test2">
    </bean>

</beans>

看来 com.Test2 如果未设置Spring轮廓,则加载。这是预期的行为吗?
我只是想了解如果配置文件被设置/取消设置,spring是如何加载类的。似乎如果没有设置概要文件,那么spring将创建类(如果它存在于概要文件之外),如果设置了概要文件,那么spring将为概要文件创建类。如果类也存在于概要文件之外,则在加载概要文件时不会加载它。
因此,在上面的示例中,如果设置了dev profile com.test1 为bean id加载 bean1 ,如果未设置配置文件,则 com.test2 已加载 bean1 . 这是预期的行为吗。

u7up0aaq

u7up0aaq1#

你所描述的行为是预期的。
通常,在spring中,有一条与bean加载相关的经验法则:加载的每个bean与另一个bean同名,并且稍后处理的bean将覆盖旧的bean。
这里的关键术语将在稍后处理。
在您的特定用例中,首先,乍一看,任何概要文件中未定义的每个bean都将包含在spring上下文中。
当您激活一个概要文件时,就像在您的示例中一样,您正在使一个新的配置片段可见:如果这个配置包含一个与另一个已经处理的bean同名的bean,如图所示,它将在spring上下文中覆盖这个bean。
不管您用来定义bean的机制、java、xml配置或两者,这一事实总是正确的。
需要注意的是,spring处理跨代码和不同库的不同配置的顺序是不确定的。在您的特定用例中,当使用xml配置时,您可以安全地假设它将按照导入主配置文件(为您选择的上下文加载机制配置的配置)的顺序加载不同的配置,并且对于每个配置,在同一个xml文件中定义bean的顺序,如果是这样的话。
除了使用springboot2的情况外,这个常规重写规则始终为true:在这种情况下,如果您按名称重写bean,则在默认情况下,将引发一个异常,表明具有此名称的bean已经在spring上下文中定义。通过指定以下配置属性,可以恢复通常的重写行为:

spring.main.allow-bean-definition-overriding=true

除了概要文件之外,springboot还允许您加载bean,这取决于几种类型的条件。这种机制通常在加载时应用 @Configuration 在自动配置过程中。

wd2eg0qa

wd2eg0qa2#

是的,这是预期的行为,任何没有指定概要文件的bean都属于“默认”概要文件。所有未指定@profile注解(或for xml)的bean都属于默认概要文件。

5gfr0r5j

5gfr0r5j3#

如果您没有明确指定一个概要文件,那么将加载属于不在任何概要文件范围内的所有bean的“默认”概要文件。
因此,是的,如果您在没有任何概要文件的情况下运行应用程序,bean1将作为 com.Test2 另一方面,通过配置一个概要文件,所有不在概要文件范围内的bean(“default”)将被替换为与定义匹配的bean(在您的例子中) com.Test1 ).
有关详细信息,请查看:
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-定义配置文件
https://www.baeldung.com/spring-profiles

相关问题