QA模式详解Spring核心(一)DI和IOC

前言:Spring核心系列文章

本文并非教程一类的文章,而是偏向于Spring底层,适合有一定框架编程经验的同学阅读。在这个系列的文章中,我会融合同学们在面试中常见的问题,如什么是IOC容器,遇到重要的,我可能还会以源代码的形式展现相应的内容,这样一问一答的形式,帮助同学们缕清Spring的重要知识点。由于本人能力有限,在行文的过程中可能会出现一些错误,请各位同学、大佬不吝赐教,共同学习。

Spring

先回顾一下Spring的基础内容。
Q:请问什么是Spring?
A:Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring可以让我们从“plain old Java objects”(POJO)中构建应用程序和通过非侵入性的POJO实现企业应用服务。(关于这一点,如果你比较熟悉Spring的话,会感受到的。在Spring的项目中,我们无需自己new一个对象或者使用工厂模式生成一个对象,只需要将对象交给Spring管理,就能实现调用对象的操作。)

经过十多年的发展,我们还是先来回顾一下Spring的整体架构,熟悉这个架构后,你将会对我后面的文章结构了然于心,高屋建瓴。

通过上图我们能够发现,SpringIOC在Spring的整体架构之中处于最底层,也就是说,SpringIOC是Spring的重中之重,所有的一切,都是建立在IOC这个地基之上的,没有IOC,Spring的其他模块也不能开花结果。所以,在第一讲中,我们将会深入的探讨一下IOC。

控制反转和依赖注入

Q:什么是控制反转?什么是依赖注入?
所谓的控制反转,就是我们刚才说的Spring的核心——IOC。这个词,很多书籍上解释的非常麻烦,初学者很容易发懵。
从“控制反转”这个词入手:先问一个问题,什么是控制?什么是反转呢?回想一下,我们最初学习Java的时候,必须自己去new一个对象,才能拿来使用,在这里面,“我们”是类的控制者。控制反转的意思是我们从控制者成为了使用者,更简单的解释是“我们把对象的创建的权利交给(反转)给Spring”。
《Spring4.x实战》一书中写的是“某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由Spring容器借助Bean的配置来进行控制”。虽然解释的很专业,但是可能大家看起来就有点懵逼了。

依赖注入(DI),依赖注入的前提是有IOC环境,调用类中有某个类(成员变量、成员属性),Spring管理的类可以直接注入(设置)到这个属性之中。一般来说,依赖注入有三种形式:

  • 构造器注入
  • Setter方法注入
  • 接口注入

Spring中能使用前两种的注入方法。什么意思呢?从下面这段代码中你就能够简单的了解一下:

private ParentService parentService;
private UsersService usersService;
private ParentContactService parentContactService;


@Autowired
public ParentController(ParentService parentService, UsersService usersService, ParentContactService parentContactService) {
    this.parentService = parentService;
    this.usersService = usersService;
    this.parentContactService = parentContactService;
}

大家不用管我这些类都是些什么东西,主要是看方法,上面表示的就是构造器注入的这种方法,当然我们使用的是注解的方式注入类。
在Spring中管理着parentService、usersService、parentContactService,这就叫做控制反转,而我们的注解和构造函数起到的作用就是依赖注入,Setter注入也是类似,就是使用set方法进行注入而已,并不像某些书籍介绍的那样繁琐。

Q:IOC容器是个什么玩意?

如果你使用过工厂模式,就会发现,其实Spring的底层就有类似于我们写的工厂模式那样的东西。通过Bean工厂和反射机制,Spring可以就可以很方便的创建某个类,然后通过依赖注入就可以提供给我们。可以将IOC容器理解为一个创建Bean的工具和Bean的集合容器。
如果你不了解Bean工厂也没有关系,下一讲中,我们将会讲述工厂模式以及Spring中的两个重量级工厂:BeanFactory和ApplicationContext。

结语

感谢你的阅读,如果你喜欢我的文章,欢迎关注我的微信公众号:最高权限比特流。

发表评论

电子邮件地址不会被公开。 必填项已用*标注