1.Spring核心机制
依赖----A对于像依赖B对象的方法;
核心机制----控制反转(IoC),别名:依赖注入
程序无需主动获取被依赖的对象,只等Spring容器注入。(property子元素和对应的setter方法)
2.依赖注入
依赖注入的两种方式:
- 设值注入:IoC容器使用成员变量的setter方法注入被依赖的对象。
- 构造注入:IoC容器使用构造器注入。
注意:Spring推荐使用面向接口编程,不管是调用者还是被依赖的对象,都应该为之定义接口,而不是面向实现类编程,这样以便程序的后期升级维护。
但是xml中的class配置,必须要写实现类。因为要通过反射出对象。
2.1设置注入
例如,我们为《Spring--1》中的Person、Axe都定义一个接口
接口:
package codeEETest;
public interface Person
{
// 定义一个使用斧子的方法
public void useAxe();
}
接口:
package codeEETest;
public interface Axe
{
// Axe接口里有个砍的方法
public String chop();
}
实现类:
package codeEETest;
public class Chinese implements Person
{
private Axe axe;
// 设值注入所需的setter方法
public void setAxe(Axe axe)
{
this.axe = axe;
}
// 实现Person接口的useAxe方法
public void useAxe()
{
// 调用axe的chop()方法,
// 表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}
Axe实现类1:
package codeEETest;
public class StoneAxe implements Axe
{
public String chop()
{
return "石斧砍柴好慢";
}
}
Axe实现类2:
package codeEETest;
public class SteelAxe implements Axe
{
public String chop()
{
return "钢斧砍柴真快";
}
}
<!-- 配置名为person的Bean,其实现类是...类 -->
<bean id="person" class="codeEETest.Chinese">
<!-- 控制调用setAxe()方法,将容器中axe Bean作为传入参数 -->
<property name="axe" ref="stoneAxe"/>
</bean>
<!-- 配置名为axe的Bean,其实现类是...类 -->
<bean id="stoneAxe" class="codeEETest.StoneAxe"/>
2.2构造注入
本质:Spring在底层以反射的方式执行带指定参数的构造器。<constructor-arg.../>子元素。
<!-- 配置名为person的Bean,其实现类是...类 -->
<bean id="person" class="codeEETest.Chinese">
<!-- 控制调用setAxe()方法,将容器中axe Bean作为传入参数 -->
<constructor-arg ref="steelAxe" />
</bean>
<!-- 配置名为axe的Bean,其实现类是...类 -->
<bean id="stoneAxe" class="codeEETest.StoneAxe"/>
允许有type属性,指明参数的类型。<constructor-arg ref="steelAxe" type="org.crazyit.app.service.Axe"/>。
例如value="23",允许当成int,这时type="int".
建议设值注入为主,构造注入为辅。对于依赖无需变化的注入,尽量构造注入;依赖其他关系的注入,尽量设值注入。