在网上看了好多描述IOC和DI和文章,但感觉看他们的描述总感觉差点意思,所以我个人也总结了一些相关的概念,希望对面试或爱学习的小伙伴共勉。
IoC 和 DI:
IoC (Inversion of Control):
大家常说就是控制反转。然而ioc不是一种新的技术,而是 Spring 的一种设计思想,这个相信大家使用过的小伙伴都应该知道。
何为ICO?
在传统的程序设计,我们直接在对象内部通过 new 来创建对象,是程序主动去创建依赖对象;而在 Spring 中有专门的一个容器来创建和管理这些对象,并将对象依赖的其他对象注入到该对象中,这个容器我们一般称为 IoC 容器。
所有的类的创建、销毁都由 Spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 Spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被 Spring 控制,所以这就叫控制反转。面试时这么说应该就非常完美了,千万不要说的太直白哦。
DI(Dependency Injection):
DI即依赖注入,是由 Martin Fowler 提出(百度来的哈哈)。可以认为 IoC 和 DI 其实是同一个概念的不同角度描述。
依赖注入是指组件之间的依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁来实现。
何为bean ?
官方概念描述:在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是一个由 Spring IoC 容器实例化,组装和管理的对象。
大白话来说:bean 可以认为是那些我们想注入到 Spring IoC 容器的 Java 对象实例的抽象。
我们经常会在 Service 上使用 @Service 注解,然后在要使用该 Service 的类中通过 @Autowire或者@Resource 注解来注入,这个 Service 就是一个 bean。在这个地方,@Service 注解相当于告诉 IoC 容器:这个类你需要帮我创建和管理;而 @Autowire 注解相当于告诉 IoC 容器:我需要依赖这个类,你需要帮我注入进来。
BeanDefinition
当你理解了 bean,BeanDefinition 就比较容易理解了。BeanDefinition 是 bean 的定义,用来存储 bean 的所有属性方法定义。
BeanFactory 和 ApplicationContext
BeanFactory:基础类型 IoC 容器,提供完整的 IoC 服务支持。
ApplicationContext:BeanFactory 的子接口,在 BeanFactory 的基础上构建,是相对比较高级的 IoC 容器实现。包含 BeanFactory 的所有功能,还提供了其他高级的特性,比如:事件发布、国际化信息支持、统一资源加载策略等。正常情况下,我们都是使用的 ApplicationContext。
以电话来举例:
我们家里使用的 “座机” 就类似于 BeanFactory,可以进行电话通讯,满足了最基本的需求。
而现在非常普及的智能手机,苹果手机、华为等,就类似于 ApplicationContext,除了能进行电话通讯,还有其他很多功能:视频、拍照、听歌等。
FactoryBean
一般情况下,我们将 bean 的创建和管理都交给 Spring IoC 容器,Spring 会利用 bean 的 class 属性指定的类来实例化 bean。
但是如果我们想自己实现 bean 的创建操作,可以实现吗?答案是可以的,FactoryBean 就可以实现这个需求。
FactoryBean 是一种特殊的 bean,它是个工厂 bean,可以自己创建 bean 实例,如果一个类实现了 FactoryBean 接口,则该类可以自己定义创建实例对象的方法,只需要实现它的 getObject() 方法即可。
FactoryBean 可能对于普通开发来说基本用不到也没去注意过,但是它其实应用的非常广,特别是在中间件中,如果你看过一些中间件的源码,一定会看到 FactoryBean 的身影。