Java 春季的订单依赖注入是什么?

Java 春季的订单依赖注入是什么?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我有一个关于spring依赖注入的问题。 我需要知道依赖项是按照在XML中声明的顺序被注入的,还是按照在XML中声明的顺序被注入的 没有这样的秩序 例如: <bean id="empBean" class="com.test.EmployeeBean"> <property name="jdbcTemplate" ref="jdbcTemplate" /> <property name="empAddress" ref="empAddres

我有一个关于spring依赖注入的问题。 我需要知道依赖项是按照在XML中声明的顺序被注入的,还是按照在XML中声明的顺序被注入的 没有这样的秩序

例如:

<bean id="empBean" class="com.test.EmployeeBean">
      <property name="jdbcTemplate" ref="jdbcTemplate" />
       <property name="empAddress" ref="empAddress" />
    </bean>


我们能否保证总是在
empName
之前初始化
jdbcTemplate
?请帮助

您不能保证这些将以任何特定顺序注入,并且您应该设计您的bean,使其无所谓——这很容易实现

所以这个类是错误的代码,因为它在bean创建之后的状态会根据Spring注入的顺序而有所不同:

public class BadClass {
    private String foo = "";
    private String foobar = "";

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public void setBar(String bar) {
        this.foobar = foo + bar;
    }

    public String toString() {
        return foobar;
    }
}
因为:

 BadClass c = new BadClass(); 
 c.setFoo("foo");
 c.setBar("bar"); 
 return c.toString()` 
。。。返回
“foobar”

。。。返回
“条”

许多人认为使用构造函数注入是最佳实践,在这种情况下,所有注入都将在构造函数的一次调用中发生

public class BetterClass {
    private String foo = "";
    private String foobar = "";

    public BetterClass(String foo, String bar) {
        this.foo = foo;
        this.foobar = foo + bar;
    }

    public String toString() {
        return foobar;
    }
}

Spring容器将遍历依赖项的DAG(有向无环图),并在不创建bean实例的情况下尽可能多地验证配置。这里的例外是单例作用域的预实例化的bean,它们是在创建容器时创建的。您可以通过向bean定义添加
lazy init=“true”
属性来修改此行为

只有当在代码中请求bean时,它才会被实际创建,首先创建它的所有依赖项(以及它们的依赖项,如果需要的话),遍历依赖项图(DAG)直到最深的依赖项

另一种情况是稍后使用完全相同的名称定义bean。这些将覆盖前面定义的bean——因此,如果您有一些bean的mock,只需在加载核心应用程序bean之后定义它即可

当某些依赖项不明确时,还可以向bean配置添加属性
dependens=“list,of,comma,separated,beanIDs”
,以指导容器


在使用注释类进行配置时,您还可以添加
@Order(N)
,其中较低的
N
s获得较高的优先级顺序,主要用于影响添加到集合中的bean的顺序,而顺序很重要。

No,因为它们之间没有依赖关系。顺便说一句,empName只是一个项目,你不能。其次,您不应该编写依赖于注入顺序的代码。感谢@slim确认lazy bean初始化的默认值为false:--但您已经超出了回答OP在这里提出的问题的范围。
public class BetterClass {
    private String foo = "";
    private String foobar = "";

    public BetterClass(String foo, String bar) {
        this.foo = foo;
        this.foobar = foo + bar;
    }

    public String toString() {
        return foobar;
    }
}