依赖注入
依赖注入(DI)是一个过程,通过该过程,对象只能通过构造函数参数,工厂方法的参数或在构造或创建对象实例后在对象实例上设置的属性来定义其依赖关系(即,与它们一起工作的其他对象)。从工厂方法返回。然后,容器在创建bean时注入那些依赖项。从根本上讲,此过程是通过使用类的直接构造或服务定位器模式来控制bean自身依赖关系的实例化或位置的bean本身的逆过程(因此称为Control Inversion)。
使用DI原理,代码更加简洁,当为对象提供依赖项时,去耦会更有效。该对象不查找其依赖项,也不知道依赖项的位置或类。结果,您的类变得更易于测试,尤其是当依赖项依赖于接口或抽象基类时,它们允许在单元测试中使用存根或模拟实现。
DI存在两个主要变体:基于构造函数的依赖注入和基于Setter的依赖注入。
基于构造函数的依赖注入:
1.使用无参构造对象,默认
beans.xml
<bean id="user" class="com.qi.pojo.User">
<property name="name" value="User的无参构造"/>
</bean>
package com.qi.pojo;
public class User {
private String name;
//有参构造
// public User(String name){
// System.out.println("User的无参构造");
// //this.name = name;
// }
public void User(){
System.out.println("User的无参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
2.使用有参构造:
package com.qi.pojo;
public class User {
private String name;
//有参构造
public User(String name){
System.out.println("User的无参构造");
//this.name = name;
}
// public void User(){
// System.out.println("User的无参构造");
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
1.下标赋值:
<bean id="user" class="com.qi.pojo.User">
<constructor-arg index="0" value="1"/>
</bean>
2.通过类型赋值
<bean id="user" class="com.qi.pojo.User">
<constructor-arg type="java.lang.String" value="2"/>
</bean>
3.通过参数名赋值
<bean id="user" class="com.qi.pojo.User">
<constructor-arg name="name" value="3"/>
</bean>
当我们创建UserT时,不给其bean赋值,但还会执行:
<!--<!–无论用不用 都会创建,spring在调用之前都给创建了–>-->
<!-- <bean id="userT" class="com.qi.pojo.UserT">-->
<!-- <constructor-arg value=""/>-->
<!-- </bean>-->
public User(String name){
System.out.println("User的无参构造");
//this.name = name;
}
该位置
总结:在配置文件加载中的时候,容器中管理的对象就已经初始化了!