定义
Spring是一个轻量级的、开源的Java框架,它可以简化开发。
版本信息
- 2003年6月,Spring Framework第一次发布在Apache 2.0许可证下。
- 2004年3月,发布了1.0版本。
- 2006年10月,发布了2.0版本。
- 2009年12月,发布了3.0版本。
- 2013年12月,发布了4.0版本。
- 2017年9月,发布了5.0版本。
JDK要求:
- Spring Framework 5.x → JDK 8+
- Spring Framework 4.x → JDK 6+
优点
- 方便解耦,简化开发。
Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护交给Spring管理。 - AOP编程的支持
Spring提供面向切面编程,可以方便地实现对程序进行权限拦截、运行监控等功能。 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,无须手动编程。 - 良好的封装
Spring对JavaEE开发中易用性差的一些API(JDBC、JavaMail等)进行了封装,降低了它们的使用难度。 - 方便程序的测试
Spring对JUnit4支持,可以通过注解方便地测试Spring程序。
体系结构
Spring采用分层架构,包含一系列的功能要素,体系结构如图1-1所示:
图1-1 Spring的体系结构
图中包含了Spring框架的所有模块, 这些模块可以满足大多数企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。接下来分别对各个模块进行介绍。
Core Container
Spring的核心容器是其他模块建立的基础,由Beans模块、Core核心模块、Context上下文模块和Expression Language表达式语言模块组成,具体介绍如下。
- Bean:提供了BeanFactory,是工厂模式的经典实现,Spring将管理对象称为Bean。
- Core:提供了Spring框架的基本组成部分,包括IoC和DI功能。
- Context:建立在Core和Beans模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext接口是上下文模块的焦点。
- SpEL:是运行时查询和操作对象图的强大的表达式语言。
Data Access/Integration
- JDBC:提供了一个JDBC的抽象层,大幅度地减少了在开发过程中对数据库操作的代码。
- ORM:对流行的对象关系映射API(JPA、JDO、Hibernate和iBatis)提供的集成层。
- OXM:对象/XML映射。
- JMS:Java消息服务。
- Transactions:事务控制。
Web模块
- Web:基础Web功能,例如:文件上传。
- WebMVC:SpringMVC实现。
- WebFlux:一个新的非堵塞函数式Reactive Web框架,可以用来建立异步非阻塞式的事件驱动,并且扩展性非常好。
- WebSocket:为Web应用提供的高效通信工具。
其他模块
- AOP:提供了面向切面编程实现,允许定义方法拦截器和切入点。
- Aspects:提供与AspectsJ的集成,它是一个功能强大且成熟的面向切面编程框架。
- Instrumentation:提供了类工具的支持和类加载器的实现。
- Messaging:用于构建基于消息的应用程序。
- Test:测试。
Spring的IoC容器
IoC是指在程序的设计中,实例不再由调用者来创建,而是由Spring容器来创建。控制权由代码转移到了外部容器,控制权发生了反转,也就是Spring的IoC思想。Spring提供了两种IoC容器,分别为BeanFactory和ApplicationContext。
BeanFactory
BeanFactory是基础类型的IoC容器,由org.springframework.beans.factory.BeanFactory接口定义,并提供了完整的IoC服务支持。BeanFactory就是一个管理Bean的工程,它主要负责初始化各种Bean,并调用它们的生命周期方法。
BeanFactory接口有多种实现,最常见的是使用org.springframework.beans.factory.xml.XmlBeanFactory根据XML配置文件中的定义来装配Bean。创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,加载配置信息的语法如下:
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F:/applicationContext.xml"));
这种加载方式在实际开发中并不多用。
ApplicationContext
ApplicationContext是BeanFactory的子接口,也被称为应用上下文。该接口的全路径为org.springframework.context.ApplicationContext,它不仅提供BeanFactory所有的功能,还以一种更加面向框架的方式增强了BeanFactory的功能。创建ApplicationContext接口实例,通常采用两种方法:
- ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当作类路径资源。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- FileSystemXmlApplicationContext:从文件系统中(指定的路径下)的XML文件载入上下文定义信息。
ApplicationContext applicationContext1 =
new FileSystemXmlApplicationContext("F:\workspaces\...\applicationContext.xml");
区别
BeanFactroy采用延迟加载形式注入Bean;ApplicationContext采用预加载形式注入Bean。后者常用。
依赖注入
依赖注入,英文缩写为DI,全称是Dependency Injection,它与控制反转的含义相同,只不过这两个称呼是从两个角度描述的同一概念。可以这样理解DI的概念:如果一个对象A需要使用另一个对象B才能实现某个功能,这时就可以说A对象依赖于B对象,而Spring容器在创建A对象时,会自动将A对象依赖的B对象注入到A对象中,此过程就是依赖注入。
依赖注入常用的方式是setter方法注入,示例代码如下:
- applicationContext.xml
<bean id="hello" class="cn.jujianfei.project.Hello">
<property name="greeter" ref="greeter"></property>
</bean>
<bean id="greeter" class="cn.jujianfei.project.Greeter"></bean>
- Hello类
private Greeter greeter;
public void setGreeter(Greeter greeter){
this.greeter = greeter;
}
实例
- 创建一个maven项目
- 引入Spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
- 创建Hello类
public class Hello{
public void test(){
System.out.println("Hello Spring!");
}
}
- applicationContext.xml
<bean id="hello" class="cn.jujianfei.project.Hello"></bean>
- 创建test类
@Test
public void test(){
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld helloWorld =(HelloWorld)applicationContext.getBean("hello");
helloWorld.test();
}