前言:之前面试的时候,总是被q到这个问题,于是小结如下。
并且面试官提示从以下方面来回答这个问题:从ioc是什么,有什么优点,如何使用,原理是什么等四个方面一次介绍。
IOC(控制反转)
1 IOC的目的:为了解决对象之间的耦合度过高的问题。
2 IOC是什么:
软件系统在没有引入IOC容器之前,如果对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
软件系统在引入IOC容器之后,这种情形就完全改变了,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
3 IOC的别名:依赖注入(DI)
通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦.
4 IOC带来的好处
- 就是可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合带来的好处。
- 置顶完接口以后,每个开发团队的成员都只需要关心实现自身的业务逻辑。而无需关注其他团队的工作进展。
- 提高了模块的可复用性。
- 模块具有热插拔特性。IOC生成对象的方式转为外置方式,也就是把对象生成放在配置文件里进行定义,当需要更换实现子类时,只要修改配置文件就可以了,完全具有热插拨的特性。
IOC实现原理剖析
IOC中最基本的技术就是反射(Reflection)编程
// spring中是通过设置私有成员变量可访问,然后通过反射将私有变量注入的。
Field[] fields = Teacher.class.getDeclaredFields();
Student student = new Student();
student.setName("zhangsan");
Teacher teacher = new Teacher();
for (Field field : fields) {
if(field.getType().getName().equals(Student.class.getName())){
//关键点!设置私有成员属性为可访问!
field.setAccessible(true);
//将已创建的对象赋值
field.set(teacher, student);
}
}
teacher.print();
IOC的注入方式
1 构造方法注入(基于xml)
2 setter属性注入(基于xml)
3 基于注解的注入(@Autowire等)
网友评论