一、Spring简介
开源:源码公开、免费试用;
简化:简化企业级开发。
解耦:耦合度降低、可插拔,便于后续维护更新升级拓展。
二、Sping核心模块
Spring 框架的这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。
Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。
Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块的焦点。
三、Spring IOC
1、基础概念
容器:Spring 是一个容器,因为它包含并且管理应用对象的生命周期。
控制反转:IOC (Inversion of Control),指的是将对象的创建权交给 Spring 去创建。
使用 Spring 之前,对象的创建都是由我们自己在代码中 new 创建。而使用 Spring之后。对象的创建都是由给了 Spring 框架。
IOC (Inversion of Control) 是指在程序开发中,对象实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IOC 思想。
IOC容器的概念:IOC 容器就是具有依赖注入功能的容器,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中 new 相关的对象,应用程序由 IOC 容器进行组装。在 Spring 中 BeanFactory 是 IOC 容器的实际代表者。
Bean的概念:在 Spring 中,被 Spring 容器所管理的对象称之为”Bean”对象。一个 Spring 的 Bean 对象可以是任何形式的 POJO。
依赖注入:DI (Dependency Injection),是指依赖的对象不需要手动调用 setXX 方法去设置,而是通过配置赋值。
2、核心API
SpringIOC容器类型:Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext。
BeanFactory 是基础类型的 IoC 容器。它由org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整的 IoC服务支持。简单来说, BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。
ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。
ClassPathXmlApplicationContext:该 类 从 类 路 径 ClassPath 中 寻 找 指 定 的 XML 配 置 文 件 , 找 到 并 装 载 完 成ApplicationContext 的实例化工作。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">ApplicationContext</span> <span style="color:#000000">applicationContext</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#008855">String</span> <span style="color:#000000">configLocation</span>);</span></span>
四、Spring IOC容器的使用
使用Spring之前的痛点:对象自己创建,每次修改源码都需要重新编译,耦合度过高,不便于后续更新升级。
下面以找对象为例。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">GirlFriend</span> {
<span style="color:#008855">void</span> <span style="color:#000000">say</span>();
}</span></span>
实现类:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 吴俊峰找女朋友的标准</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">GirlfriendImplWJF</span> <span style="color:#770088">implements</span> <span style="color:#000000">GirlFriend</span>{
<span style="color:#555555">@Override</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">say</span>() {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"小峰峰"</span>);
}
}</span></span>
实现类2:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 杨涵找女朋友的标准</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">GirlfriendImplYh</span> <span style="color:#770088">implements</span> <span style="color:#000000">GirlFriend</span>{
<span style="color:#555555">@Override</span>
<span style="color:#770088">public</span> <span style="color:#008