一 Spring IOC技术简介
图中对象A,B,C和D如果看成手表机芯,任何一个齿轮出现问题,手表都无法正常运转,它们之间的耦合度非常紧密
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。
IOC是为了解决对象之间的耦合度过高的问题,实现对象之间的“解耦”
IOC是 控制反转,反转了什么?实际是获得依赖对象的过程被反转了。
反转前:需要编写程序代码自主创建,并且先创建依赖对象,对象之间关系紧密。
反转后:对象之间的依赖关系由IOC容器动态管理,且需要对象也由IOC容器负责。
降低耦合度;
有助于团队成员分工明确、责任明晰,容易将一个大的任务划分为细小的任务;
提高可复用性;
维护简单,只需要修改配置即可。
第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。
第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。
第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。
第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。
二 IOC配置
项目中配置Spring的资源配置文件,配置文件是.xml,文件结构:
项目中每个类实例化通过在xml文件的beans节点中增加bean子节点,一个bean就是一个对象
Id:表示实例化的对象的唯一标识,不能再您项目的配置中出现重复;
Class:表示创建对象的类名称,含有完整的包名路径;
Constructor-arg:表示构造方法参数配置节点,如果没有带参的构造方法,就没有该节点;节点中index表示参数的顺序索引,第一个索引为0,其他以此类推;value表示对应的值
property:表示属性节点,name表示属性名称,value表示默认的属性值;ref表示值引用,填写的内容一般是bean的id值。
三 IOC应用
问题:实现学生对象的IOC的实例化,学生类结构及学生班级类结构:
常规实现方法:
班级实例化:
StudentClass myclass=new StudentClass();//实例化班级对象
myclass.setId(“001”);
myclass.setName(“16软件技术1班”);
myclass.setCount(0);
学生实例化:
Student stu=new Student (“001”,“wph”);//实例化学生对象
stu.setSex(“001”);
stu.setBirthday(Date.valueOf("2000-1-1"));
stu.setMyClass (myclass);
IOC实现方法
: