IOC程序开发思路过程:
首先,一般程序这么引用对象:
public class xfDetailActivity {
private LineChart chart = new LineChart();
chart.show();
}
public class xfDetailActivity {
private Chart chart = new LineChart();
chart.show();
}
现在,是在xfDetailActivity中主动去分配LineChart给Chart变量,
如果有种方式,能由框架自己根据条件判断该用哪种Chart来实例化Chart变量,这是不是一种反转。
本来A创建B,现在C把B给A。这个C就是支持IOC的框架。
public class xfDetailActivity {
private Chart chart;
public xfDetailActivity(Chart chart){
this.chart = chart;
}
chart.show();
}
上面的类中并没有指明是哪种Chart来实例化,由框架的配置文件的配置项来配置决定。
再比如网络请求类,声明一个网络请求接口有一个Post方法,具体实现类会有Mysql、Orical...等不同的实现类,代码调用不必在意是哪个实现类的Post方法,只需调接口类中的Post方法即可,具体是调的MySql类的Post还是Orical的Post,由配置文件来配置。
上面代码中展示的“构造方法注入”,显然有局限性,如果xfDetailActivity这个类需要10个不同的对象,那么要在构造方法传入10个参数吗?
为了优化,引入“属性注入”:
public class xfDetailActivity {
private Chart chart;
private Phone phone;
public void setChart(Chart chart){
this.chart = chart;
}
public void setPhone(Phone phone){
this.phone = phone;
}
chart.show();
phone.call();
}
为了方便统一管理xfDetailActivity类所需要注入的接口,我们声明一个类,单独列出所有需要注入的接口:
public interface xfDetailArrangable{
void injectChart(Chart chart);
void injectPhone(Phone phone);
}
然后xfDetailActivity实现这个管理接口:
public class xfDetailActivity implements xfDetailArrangable {
private Chart chart;
private Phone phone;
public void injectChart(Chart chart){
this.chart = chart;
}
public void injectPhone(Phone phone){
this.phone = phone;
}
chart.show();
phone.call();
}
spring提供了一种配置文件的方式完成管理接口(xfDetailArangable)的注入工作: