IoC的理解

230 阅读2分钟

1.什么是IoC

简单来说,IoC是控制反转,类似于好莱坞原则,主要有依赖查找和依赖注入实现。

Hollywood principle:"Don't call me; I'll call you."

更多哈莱坞原则参考 什么是好莱坞原则

2.什么是Spring IoC 容器?

IOC容器就是具有依赖查找、依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

3. 依赖查找和依赖注入的区别?

简单来说,

  • 依赖查找是主动和手动的依赖查找方式,通常需要依赖容器和标准api去实现;
  • 而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和api。

image.png

4. Spring作为IoC容器有什么优势?

Spring 优势有

  • 典型的 IoC 管理,依赖查找和依赖注入
  • AOP 抽象
  • 事务抽象
  • 事件机制
  • SPI 扩展
  • 强大的第三方整合
  • 易测试性
  • 更好的面向对象

4. BeanFactory 与 FactoryBean

BeanFactory 是IoC的底层容器。 FactoryBean是创建Bean的一种方式,帮助实现复杂的初始化逻辑。

public interface FactoryBean<T> {
	//从工厂中获取bean
	@Nullable
	T getObject() throws Exception;
	//获取Bean工厂创建的对象的类型
	@Nullable
	Class<?> getObjectType();
	//Bean工厂创建的对象是否是单例模式
	default boolean isSingleton() {
		return true;
	}
}
  • 他们两个都是工厂,都是接口,但FactoryBean本质上还是一个Bean,也归BeanFactory管理
  • BeanFactory是Spring容器的顶层接口,FactoryBean更类似于用户自定义的工厂接口。

FactoryBean使用场景

说了这么多,为什么要有FactoryBean这个东西呢,有什么具体的作用吗?
FactoryBean在Spring中最为典型的一个应用就是用来创建AOP的代理对象

我们知道AOP实际上是Spring在运行时创建了一个代理对象,也就是说这个对象,是我们在运行时创建的,而不是一开始就定义好的,这很符合工厂方法模式。更形象地说,AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。这个对象在Spring中就是——ProxyFactoryBean

所以,FactoryBean为我们实例化Bean提供了一个更为灵活的方式,我们可以通过FactoryBean创建出更为复杂的Bean实例。