spring loC的介绍:
(文中有部分内容转于这篇文章https://blog.csdn.net/qq_40587575/article/details/79901550)
loC——Inversion of Control 即“控制反转”,是一种设计思想。在java开发中,loc意味着将你设计好的对象交给容器控制,而不是传统的由对象内部控制。
**谁控制谁,控制了什么?**传统的Java SE程序设计,是由程序主动去创建依赖对象,而loC是由一个专门的容器来创建依赖对象,即由loC容器来控制对象的创建。这其中,**谁控制谁?**当然是loC控制了对象;**控制了什么?**控制了外部资源的获取(不只是对象,包括比如文件等)。
**为何是反转,什么地方反转了?**传统应用程序中,是由我们在对象中主动去控制去直接获取依赖对象,也就是正转;而反转是由容器来帮忙创建及注入依赖对象。为何要反转?,因为容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。**什么地方反转了?**依赖对象的获取被反转了。
1.2 loC和DI
DI------Dependency Injection,即依赖注入,组件之间的依赖关系由容器在运行期决定,即由容器动态地将某个依赖关系注入到组件当中。依赖注入的目的是为了提升组件重用的频率,并为系统搭建一个灵活可扩展的平台。
理解DI的关键是,谁依赖谁,为什么依赖?,谁注入谁,注入了什么?
**谁依赖谁?**应用程序依赖于loC容器
**为什么依赖?**应用程序需要loC容器来提供对象需要的外部资源。
**谁注入谁?**loC容器注入应用程序某个对象,应用程序依赖的对象。
**注入了什么?**注入了某个对象所需要的外部资源(包括对象、资源、常用数据)
loC和DI的区别?
其实他们是同一个概念的不同角度描述,由于控制反转概念比较含糊,所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
1.3 Spring loC容器
Spring的loC容器发生的事情其实也很简单,总结有两个阶段。
1、采摘和手机“咖啡豆”(bean)
2、研磨和烹饪咖啡。
(1)收集和注册
第一个阶段可以认为是构建和收集 bean 定义的阶段,在这个阶段中,我们可以通过 XML 或者 Java 代码的方式定义一些 bean,然后通过手动组装或者让容器基于某些机制自动扫描的形式,将这些 bean 定义收集到 IoC 容器中。
假设我们以 XML 配置的形式来收集并注册单一 bean,一般形式如下:
<bean id="mockService" class="...MockServiceImpl">.</bean>
想批量地收集并注册到 IoC 容器中,我们也可以通过 XML Schema 形式的配置进行批量扫描并采集和注册:
<context:component-scan basepackage="com.keevol">
(2)分析和组装
当第一阶段工作完成后,我们可以先暂且认为 IoC 容器中充斥着一个个独立的 bean,它们之间没有任何关 系。但实际上,它们之间是有依赖关系的,所以,IoC 容器在第二阶段要干的事情就是分析这些已经在 IoC 容器之中的 bean,然后根据它们之间的依赖关系先后组装它们。
如果 IoC 容器发现某个 bean 依赖另一个 bean,它就会将这另一个 bean 注入给依赖它的那个 bean,直到 所有 bean 的依赖都注入完成,所有 bean 都“整装待发”,整个 IoC 容器的工作即算完成。
至于分析和组装的依据,Spring 框架最早是通过 XML 配置文件的形式来描述 bean 与 bean 之间的关系 的,随着 Java 业界研发技术和理念的转变,基于 Java 代码和 Annotation 元信息的描述方式也日渐兴盛(比如 @Autowired 和 @Inject),但不管使用哪种方式,都只是为了简化绑定逻辑描述的各种“表象”,最终都是为本阶段的最终目的服务。
很多 Java 开发者一定认为 Spring 的 XML 配置文件是一种配置(Configuration),但本质上,这些配置文 件更应该是一种代码形式,XML 在这里其实可以看作一种 DSL,它用来表述的是 bean 与 bean 之间的依赖绑 定关系,如果没有 IoC 容器就要自己写代码新建(new)对象并配置(set)依赖。