依赖注入的方式:属性注入,构造器注入,工厂注入
package cn.et.demo1;
public class A {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package cn.et.demo1;
public class B {
private A a;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
1)属性注入:
<!-- id:类实例的名字 class:类的路径,包名.类名-->
<bean id="a" class="cn.et.demo1.A">
<!-- 给类中的属性赋值,name:属性名, value:赋给属性的值 -->
<property name="name" value="ssg"></property>
<!-- 等同
<property name="name" >
<value>ssg</value>
</property>
-->
</bean>
<bean id="b" class="cn.et.demo1.B"></bean>
<!-- 给类中的类属性赋值 -->
<bean id="bb" class="cn.et.demo1.B" >
<!-- ref:类对象 value:基本类型的值,数字,字符等 -->
<property name="a" ref="a"></property>
<!-- 等同
<property name="a">
<ref bean="a"/>
</property>
-->
</bean>
2)构造器注入:
package cn.et.demo2;
public class D {
private C c;
private String id;
private String name;
public D(C c, String id, String name) {
super();
this.c = c;
this.id = id;
this.name = name;
}
public C getC() {
return c;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
package cn.et.demo2;
public class C {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<bean id="c" class="cn.et.demo2.C">
<property name="name" value="aa"></property>
</bean>
<!-- 构造器注入 -->
<bean id="d" class="cn.et.demo2.D">
<!-- 给构造器的属性赋值 -->
<!-- 根据构造器中的参数索引来赋值,索引从0开始,赋值顺序不能变
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="ssg"></constructor-arg>
<constructor-arg index="2" ref="c"></constructor-arg>
-->
<!-- 根据构造器中的参数名来赋值 -->
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="ssg"></constructor-arg>
<constructor-arg name="c" ref="c"></constructor-arg>
<!-- 根据构造器中参数的类型赋值,可以根据参数类型的不同打乱顺序赋值,但同一类型的参数不能打乱顺序赋值
<constructor-arg type="java.lang.String" value="ssg"></constructor-arg>
<constructor-arg type="cn.et.demo2.C" ref="c"></constructor-arg>
<constructor-arg type="java.lang.String" value="1"></constructor-arg>
-->
</bean>
自动装配:
java类:A,B
<!--
自动转配:autowire
1) autowire="byType" 根据类型,自动导入需要的类属性,如果定义的类属性是单个,导入的类属性有>=2个类实例,报错
如果定义的类属性是集合,导入的类属性有>=2个类实例没问题
2) autowire="byName" 根据类中定义的类属性的名字,如果bean中有>=2的类属性的实例,报错
-->
<bean id="b" class="cn.et.demo3.B" autowire="byName"></bean>
package cn.et.demo1;
public class A {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package cn.et.demo1;
public class B {
private A a;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
1)属性注入:
<!-- id:类实例的名字 class:类的路径,包名.类名-->
<bean id="a" class="cn.et.demo1.A">
<!-- 给类中的属性赋值,name:属性名, value:赋给属性的值 -->
<property name="name" value="ssg"></property>
<!-- 等同
<property name="name" >
<value>ssg</value>
</property>
-->
</bean>
<bean id="b" class="cn.et.demo1.B"></bean>
<!-- 给类中的类属性赋值 -->
<bean id="bb" class="cn.et.demo1.B" >
<!-- ref:类对象 value:基本类型的值,数字,字符等 -->
<property name="a" ref="a"></property>
<!-- 等同
<property name="a">
<ref bean="a"/>
</property>
-->
</bean>
2)构造器注入:
package cn.et.demo2;
public class D {
private C c;
private String id;
private String name;
public D(C c, String id, String name) {
super();
this.c = c;
this.id = id;
this.name = name;
}
public C getC() {
return c;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
package cn.et.demo2;
public class C {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<bean id="c" class="cn.et.demo2.C">
<property name="name" value="aa"></property>
</bean>
<!-- 构造器注入 -->
<bean id="d" class="cn.et.demo2.D">
<!-- 给构造器的属性赋值 -->
<!-- 根据构造器中的参数索引来赋值,索引从0开始,赋值顺序不能变
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="ssg"></constructor-arg>
<constructor-arg index="2" ref="c"></constructor-arg>
-->
<!-- 根据构造器中的参数名来赋值 -->
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="ssg"></constructor-arg>
<constructor-arg name="c" ref="c"></constructor-arg>
<!-- 根据构造器中参数的类型赋值,可以根据参数类型的不同打乱顺序赋值,但同一类型的参数不能打乱顺序赋值
<constructor-arg type="java.lang.String" value="ssg"></constructor-arg>
<constructor-arg type="cn.et.demo2.C" ref="c"></constructor-arg>
<constructor-arg type="java.lang.String" value="1"></constructor-arg>
-->
</bean>
自动装配:
java类:A,B
<!--
自动转配:autowire
1) autowire="byType" 根据类型,自动导入需要的类属性,如果定义的类属性是单个,导入的类属性有>=2个类实例,报错
如果定义的类属性是集合,导入的类属性有>=2个类实例没问题
2) autowire="byName" 根据类中定义的类属性的名字,如果bean中有>=2的类属性的实例,报错
-->
<bean id="b" class="cn.et.demo3.B" autowire="byName"></bean>