Spring 框架的发展历史
Spring 框架自 2003 年首次发布以来,已经成为 Java 企业级应用开发中最流行的框架之一。它由 Rod Johnson 创建,并由 Pivotal Software(现为 VMware 的一部分)维护。Spring 框架的发展可以分为几个重要的阶段:
-
Spring 1.x (2003-2005)
- 核心特性:依赖注入(Dependency Injection, DI)、面向切面编程(Aspect-Oriented Programming, AOP)、事务管理。
- 主要目标:简化企业级 Java 开发,提供轻量级的解决方案。
-
Spring 2.x (2006-2009)
- 增强功能:引入了注解配置(如
@Autowired
、@Service
等),进一步减少了 XML 配置。 - 模块化:增加了更多模块,如 Spring MVC、Spring Security 等。
- 支持 Java 5+:利用 Java 5 的新特性,如泛型和注解。
- 增强功能:引入了注解配置(如
-
Spring 3.x (2009-2013)
- 全面支持 Java 5+:引入了基于 Java 配置的类(如
@Configuration
和@Bean
)。 - REST 支持:增强了对 RESTful Web 服务的支持。
- 改进的表达式语言:引入了 SpEL(Spring Expression Language)。
- 全面支持 Java 5+:引入了基于 Java 配置的类(如
-
Spring 4.x (2013-2017)
- 支持 Java 8:充分利用 Java 8 的新特性,如 Lambda 表达式和 Stream API。
- 响应式编程:引入了 Spring WebFlux,支持响应式编程模型。
- 云原生支持:与 Cloud Foundry 和其他云平台集成更加紧密。
-
Spring 5.x (2017-至今)
- Kotlin 支持:全面支持 Kotlin 编程语言。
- 响应式编程增强:进一步完善了 WebFlux 和响应式数据访问。
- 性能优化:提高了框架的性能和内存使用效率。
- 安全性增强:加强了安全性和加密功能。
代码示例展示框架演进的好处
为了更好地展示 Spring 框架在不同版本中的演进及其带来的好处,我们可以通过一个简单的例子来比较不同版本的实现方式。
示例需求
创建一个简单的服务,该服务有一个方法用于返回问候语。
1. Spring 1.x (XML 配置)
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
applicationContext.xml
<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
http://www.springframework.org/schema/beans/spring-beans-1.2.xsd">
<bean id="greetingService" class="com.example.demo.GreetingService"/>
</beans>
GreetingService.java
package com.example.demo;
public class GreetingService {
public String sayHello() {
return "Hello, World!";
}
}
Main.java
package com.example.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
GreetingService greetingService = (GreetingService) context.getBean("greetingService");
System.out.println(greetingService.sayHello());
}
}
2. Spring 2.x (注解 + XML 配置)
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>2.5.6</version>
</dependency>
</dependencies>
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.example.demo"/>
</beans>
GreetingService.java
package com.example.demo;
import org.springframework.stereotype.Service;
@Service
public class GreetingService {
public String sayHello() {
return "Hello, World!";
}
}
Main.java
package com.example.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
GreetingService greetingService = context.getBean(GreetingService.class);
System.out.println(greetingService.sayHello());
}
}
3. Spring 3.x (纯注解配置)
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.18.RELEASE</version>
</dependency>
</dependencies>
ApplicationConfig.java
package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public GreetingService greetingService() {
return new GreetingService();
}
}
GreetingService.java
package com.example.demo;
public class GreetingService {
public String sayHello() {
return "Hello, World!";
}
}
Main.java
package com.example.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
GreetingService greetingService = context.getBean(GreetingService.class);
System.out.println(greetingService.sayHello());
}
}
4. Spring Boot (自动配置)
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@org.springframework.beans.factory.annotation.Autowired
private GreetingService greetingService;
public void run(String... args) throws Exception {
System.out.println(greetingService.sayHello());
}
}
GreetingService.java
package com.example.demo;
import org.springframework.stereotype.Service;
@Service
public class GreetingService {
public String sayHello() {
return "Hello, World!";
}
}
对比总结
-
配置文件:
- Spring 1.x:需要大量的 XML 配置文件。
- Spring 2.x:引入了注解配置,但仍需部分 XML 配置。
- Spring 3.x:支持纯注解配置,完全去除了 XML。
- Spring Boot:通过
@SpringBootApplication
自动配置,几乎不需要手动配置。
-
依赖管理:
- Spring 1.x:需要手动添加每个依赖及其版本。
- Spring 2.x:依赖管理有所改善,但仍然需要手动管理。
- Spring 3.x:依赖管理更加灵活,支持 Maven 和 Gradle。
- Spring Boot:通过
spring-boot-starter
统一管理依赖版本,简化依赖管理。
-
启动方式:
- Spring 1.x:需要将应用打包并部署到外部容器中。
- Spring 2.x 和 Spring 3.x:可以使用内嵌的 Tomcat 或 Jetty 启动应用。
- Spring Boot:可以直接运行
main
方法启动应用,内置了嵌入式服务器。
-
生产就绪特性:
- Spring 1.x 和 Spring 2.x:需要额外配置监控和管理功能。
- Spring 3.x:提供了更多的监控和管理工具。
- Spring Boot:自带了许多生产就绪的特性,如 Actuator 用于监控和管理应用。
通过这些对比可以看出,Spring 框架随着版本的演进,不断简化配置、提高开发效率,并且增加了许多现代化的功能,使得开发者能够更专注于业务逻辑的实现。