1、什么是IOC?
IOC的全英文名是:Inversion Of Control ,直译过来就是控制反转,控制反转是把传统上由程序代码直接操控对象(new对象)的调用权交给ioc容器,由容器来实现对象的创建,依赖,销毁,初始化等等。
2、什么是 Spring IOC 容器?
Spring 框架是一个 IOC 容器的实现,DI 依赖注入是它的实现的一个原则,提供依赖查找和依赖注入两种依赖处理,管理着 Bean 的生命周期。Spring 还提供了 AOP 抽象、事件抽象、事件监听机制、SPI 机制、强大的第三方整合、易测试性等其他特性。
3、IOC 容器的作用?
- 依赖处理,通过依赖查找或者依赖注入
- 管理托管的资源(Java Bean 或其他资源)的生命周期
- 管理配置(容器配置、外部化配置、托管的资源的配置)
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期。
简单的来说就是:
我们自己new一个对象,可能会导致程序耦合度过高,后期可能维护不便。引入IOC,将创建对象的控制权交给Spring的IOC容器;如果要去使用对象,通过DI(依赖注入)@Autowired注解 自动注入,就可以使用对象了!
4、IOC 和 DI 的区别?
DI 依赖注入不完全等同于IOC ,更应该说 DI 依赖注入是 IOC 的一种实现方式或策略。
依赖查找和依赖注入都是 IOC 的实现策略。
- 依赖查找就是在应用程序里面主动调用 IOC 容器提供的接口去获取对应的 Bean 对象,而依赖注入是在 IOC 容器启动或者初始化的时候,通过构造器、字段、setter 方法或者接口等方式注入依赖。
- 依赖查找相比于依赖注入对于开发者而言更加繁琐,具有一定的代码入侵性,需要借助 IOC 容器提供的接口,所以我们总是强调后者。
- 依赖注入在 IOC 容器中的实现也是调用相关的接口获取 Bean 对象,只不过这些工作都是在 IOC 容器启动时由容器帮你实现了,在应用程序中我们通常很少主动去调用接口获取 Bean 对象。
5、IOC的优点有哪些?
-
集中管理对象、方便维护 、降低耦合度
-
最小的代价和最小的侵入性使松散耦合得以实现
-
IOC容器支持加载服务时的饿汉式,初始化的懒加载
6、Spring IoC 的实现机制是什么?
Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
工厂相对应的就是beanfactory的getBean()方法,反射就是Spring底层实例化对象所采用的机制
实现代码示例:
interface fruit{void eat();
}class Apple implements fruit {@Overridepublic void eat() {System.out.println("Apple");}
}class Orange implements fruit {@Overridepublic void eat() {System.out.println("Orange");}
}class Factory {public static fruit getInstance(String ClassName) {fruit f = null;//通过反射创建对象 try {// 相当于Spring中new了一个ClassPathXmlApplicationContextf = (fruit)Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}
}class Test {public static void main(String[] args) {//getInstance时静态的,直接调用即可Factory.getInstance()fruit f = Factory.getInstance("Apple");if(f != null)f.eat();}
}//输出 Apple
注意点:
- Class.forName(“”)返回的是类
- Class.forName(“”).newInstance()返回的是object
源码下载:https://gitee.com/charlinchenlin/koo-erp