概念
IOC(Inversion Of Controll 控制反转)
- 什么是IOC:
对象的依赖关系由容器来建立。
DI(Dependency Injection 依赖注入)
- 容器通过调用对象提供的set方法或者构造器来建立依赖关系。
注意:IOC时目标,DI 是手段。
注入依赖关系方法
1、set方法注入
属性:
< property name=" " ref=" "/> |
---|
若属性name的值为“bt”,那么容器在创建对象时,会调用对象的setBt()方法 |
name | ref |
---|---|
属性指定属性名 | 属性指定属性值(被注入的bean的id) |
<bean id="b1" class="ioc.B"/>
<!--
property元素:表示使用set方法来注入依赖关系。
其中,name属性指定属性名,
ref属性指定属性值(被注入的bean的id)
-->
<bean id="a1" class="ioc.A">
<property name="b" ref="b1"/>
</bean>
public class B {
public B() {
System.out.println("B()");
}
public void f1() {
System.out.println("f1()");
}
}
public class A {
private B b;
public A() {
System.out.println("A()");
}
public void setB(B b) {
System.out.println("setB()");
this.b=b;
}
public void execute() {
System.out.println("execute()");
b.f1();
}
}
AbstractApplicationContext ac=
new ClassPathXmlApplicationContext("ioc.xml");
System.out.println(ac);
A a=ac.getBean("a1",A.class);
a.execute();
ac.close();
结果:
2、构造器方式注入
标签:
< constructor index=" " ref=" " /> |
---|
index | ref |
---|---|
表示构造器参数的位置,如0、1、2 | 注入 对象的id |
代码:
1
<bean id="b1" class="ioc.B"/>
<bean id="a1" class="ioc.A">
<constructor-arg index="0" ref="b1"/>
</bean>
2
public class A {
private B b;
public A() {
System.out.println("A()");
}
public A(B b){
this.b=b;
}
public void execute() {
System.out.println("execute()");
b.f1();
}
}
3
public class B {
public B() {
System.out.println("B()");
}
public void f1() {
System.out.println("f1()");
}
}
4
AbstractApplicationContext ac=
new ClassPathXmlApplicationContext("ioc.xml");
System.out.println(ac);
A a=ac.getBean("a1",A.class);
a.execute();
ac.close();
3、自动装配(了解)
自动装配,spring容器依据某种规则,自动建立对象之间的依赖关系。
注意:
a、默认情况下,容器不会自动装配
b、可以通过指定autowire属性来来告诉spring容器进行自动装配。(
容器仍然需要通过set方法或者构造器来完成依赖关系的建立)
<bean id=“a1” class=“ioc.A"autowire=” " /> |
---|
属性值:
byName:
容器依据类中成员变量名在xml中查找id值与之相同的bean,然后把对应该bean的对象通过set方法注入。
<bean id="b1" class="ioc.B"/>
<bean id="a1" class="ioc.A" autowire="byName" />
public class A {
private B b1;
public A() {
System.out.println("A()");
}
public void setB1(B b1) {
this.b1 = b1;
}
public void execute() {
System.out.println("execute()");
b1.f1();
}
}
注意:
- 如果找不到对应的bean,将注入null。
- 不可能找到多个符合条件的bean。
byType:
容器依据成员变量的类型查找与之匹配的bean,然后调用set方法完成注入。
<bean id="b1" class="ioc.B"/>
<bean id="a1" class="ioc.A" autowire="byType" />
注意:
- 如果找不到对应的bean,将注入null。
- 可能找到多个符合条件的bean,此时会报错·。
constructor:
与byType类似,不同的是通过构造器。来完成注入。
4、注入基本类型
public class A {
private String name;
private int age;
public void setName(String name) {
this.name = name;
System.out.println(this.name);
}
public void setAge(int age) {
this.age = age;
System.err.println(this.age);
}
}
<bean id="a1" class="ioc.A" >
<property name="name" value="java"/>
<property name="age" value="1998"/>
</bean>
5、注入集合类型(Map、Set、List、Property)
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class A {
private List<String> city;
private Set<String> interest;
private Map<String, String> kc;
private Properties db;
public void setDb(Properties db) {
this.db = db;
System.out.println(this.db);
}
public void setKc(Map<String, String> kc) {
this.kc = kc;
System.out.println(this.kc);
}
public void setInterest(Set<String> interest) {
this.interest = interest;
System.out.println(this.interest);
}
public void setCity(List<String> city) {
this.city = city;
System.out.println(this.city);
}
}
<bean id="a1" class="ioc.A" >
<property name="city">
<list>
<value>beijing</value>
<value>guangzhou</value>
</list>
</property>
<property name="interest">
<set>
<value>钓鱼</value>
<value>学代码</value>
</set>
</property>
<property name="kc">
<map>
<entry key="english" value="hhf"/>
<entry key="math" value="jj"/>
</map>
</property>
<property name="db">
<props>
<prop key="name">tiger</prop>
<prop key="pwd">123456</prop>
</props>
</property>
</bean>