Java 春季的订单依赖注入是什么?
我有一个关于spring依赖注入的问题。 我需要知道依赖项是按照在XML中声明的顺序被注入的,还是按照在XML中声明的顺序被注入的 没有这样的秩序 例如: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
<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;
}
}