1、Spring简介
Spring 是当前主流的 Java Web 开发框架,它是为了解决企业应用开发的复杂性问题而产生 的。 对于一个 Java 开发者来说,掌握 Spring 框架的使用,已是其必备的技能之一。 本章将对 Spring 框架的基础知识进行详细的讲解。
2、什么是Spring?
- Spring 是由 Rod Johnson 组织和开发的一个分层的 Java SE/EE fu川一stack (一站式)轻量 级开源框架,它以 loC ( Inversion of Control ,控制反转)和 AOP ( Aspect Oriented Programming , 面向切面编程)为内核,使用基本的 JavaBean 来完成以前只可能由 EJB ( Enterprise Java Beans , Java 企业 Bean) 完成的工作,取代了 EJB 的靡肿、 低效的开发模式。
- Spring 致力于 Java EE 应用各层的解决方案,在表现层它提供了 Spring MVC 以及与 Struts 框架的整合功能;在业务逻辑层可以管理事务、 记录日志等;在持久层可以整合 MyBatis、 Hibernate、 JdbcTemplate 等技术。 因此,可以说 Spring 是企业应用开发很好的"一站式"选 择。 虽然 Spring 贯穿于表现层、 业务逻辑层和持久层,但它并不想取代那些已有的框架,而是 以高度的开放性与它们进行无缝整合
3、Spring框架的优点
Spring 具有简单、可测试和松辑合等特点,从这个角度出发, Spring 不仅可以用于服务器 端开发,也可以应用于任何 Java 应用的开发中。 关于 Spring 框架优点的总结,具体如下。
- 非侵入式设计
Spring 是一种非侵入式( non-invasive )框架,它可以使应用程序代码对框架的依赖 、最小化。- 方便解耦、 简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给 Spring 容器 管理,大大地降低了组件之间的搞合性。- 支持 AOP
Spring 提供了对 AOP 的支持,它允许将一些通用任务,如安全、 事务、 曰志等进行集中式 处理,从而提高了程序的复用性。- 支持声明式事务处理
只需要通过配置就可以完成对事务的管理,而无须手动编程。- 方便程序的测试
Spring 提供了对 Junit4 的支持,可以通过注解方便地测试 Spring 程序。- 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts、 Hibernate、 MyBatis、 Quartz 等)的直接支持。- 降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API (如 JDBC、 JavaMail 等),都提供了封装, 使这些 API 应用难度大大降低
4、体系结构
(1)模块信息

- Core Container (核心窑器)
Spring 的核心容器是其他模块建立的基础,它主要由 Beans 模块、 Core 模块、 Context 模 块、 Context-support 模块和 SpEL ( Spring Expression Language , Spring 表达式语言)模块 组成,具体介绍如下。
• Beans 模块:提供了 BeanFactory,是工厂模式的经典实现, Spring 将管理对象称为 Bean。
• Core 核心模块:提供了 Spring 框架的基本组成部分,包括 loC 和 DI 功能。
• Context 上下文模块: 建立在 Core 和 Beans 模块的基础之上,它是访问定义和配置的任 何对象的媒介。 其中 ApplicationContext 接口是上下文模块的焦点。
• Context-support 模块:提供了对第三方库嵌入 Spring 应用的集成支持,比如缓存 ( EhCache、 Guava、 JCache)、 邮件服务 (JavaMail)、 任务调度( CommonJ、 Quartz) 和模 板引擎( FreeMarker、 JasperReports、 速率)。
• SpEL 模块:是 Spring 3.0 后新增的模块,它提供了 Spring Expression Language 支持, 是运行时查询和操作对象图的强大的表达式语言。- Data Access/lntegration (戴帽访问l集成)
数据访问/集成层包括 JDBC、 ORM 、 OXM、 JMS 和 Transactions 模块,真体介绍如下。
• JDBC 模块:提供了一个 JDBC 的抽象层,大幅度地减少了在开发过程中对数据库操作的 编码。
• ORM 模块:对流行的对象关系映射 API ,包括 JPA、 JDO 和 Hibernate 提供了集成层支持。
• OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、 Castor、 XMLBeans、 JiBX 和 XStream。
• JMS 模块:指 Java 消息传递服务,包含使用和产生信息的特性,自 4. 1 版本后支持与 Spring-message 模块的集成。
• Transactions 事务模块:支持对实现特殊接口以及所有 POJO 类的编程和声明式的事 务管理。- Web
Spring 的 Web 层包括 WebSocket、 Servlet、 Web 和 Portlet 模块,具体介绍如下。
• WebSocket 模块: Spring 4.0 以后新增的模块,它提供了 WebSocket 和 SockJS 的实现, 以及对 STOMP 的支持。
• Servlet 模块:也称为 Spring-webmvc 模块,包含了 Spring 的模型一视图一控制器(MVC) 和 REST Web Services 实现的 Web 应用程序。
• Web 模块:提供了基本的 Web 开发集成特性,例如: 多文件上传功能、 使用 Servlet 监 听器来初始化 loC 容器以及 Web 应用上下文。
• Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Servlet 模块的功能。- 其他模块
Spring 的其他模块还有 AOP、 Aspects、 Instrumentation 以及 Test 模块,具体介绍如下。
• AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能 进行分离,以降低搞合性。
• Aspects 模块:提供了与 AspectJ 的集成功能, AspectJ 是一个功能强大且成熟的面向切 面编程 (AOP) 框架。
• Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器 中使用。
• Messaging 模块: Spring 4.0 以后新增的模块,它提供了对消息传递体系结构和协议 的支持。
• Test 模块:提供了对单元测试和集成测试的支持。
(2)各个模块之间的联系

5、IOC与DI
IOC(Inversion of Control)控制反转
A需要B,本身不创建,等待IOC容器创建注入到A中
DI(Dependency Injection)依赖注入
A依赖于B,等待IOC容器创建注入
IOC与DI是一件事的不同说法
可以设计类的创建模式,默认单例模式
IOC与new的区别:IOC是松耦合,new是紧耦合
6、创建简单的Maven工程
创建一个简单的Maven工程——TestSpring
(1)导入依赖jar包
https://mvnrepository.com/
搜索spring context,找到Maven代码坐标,写入pom.xml文件中
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
(2)创建配置文件——在resources下
创建applicationContext.xml文件
文档头代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
(3)在java目录下创建package(test),创建A类与B类
- A代码
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
public void test()
{
System.out.println(b);
}
}
注意:方法名必须set+大写的依赖的类名
- B不写任何代码
- applicationContext文件代码:
<bean id="a" class="com.neuedu.test.A">
<property name="b" ref="b"></property>
</bean>
<bean id="b" class="com.neuedu.test.B"></bean>
注意:name:类中的属性名,ref:另一个bean的id
若想创建的类不是单例模式,在a的<bean>中class后面加scope=“prototype”
<bean id="a" class="com.neuedu.test.A" scope=“prototype”>
<property name="b" ref="b"></property>
</bean>
(4)创建TestIOC类对代码测试
首先导入jar包,搜索Junit,导入坐标到pom.xml
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
- TestIOC代码:
@Test
public void test1()
{
//1.启动spring的容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.从容器获取A对象
A a = context.getBean(A.class);
//3.调用a的方法
a.test();
}
由以上代码可知,A中并没有new一个B的对象,但是得到了
B,这就是IOC容器创建的对象,然后注入到A里面