Spring 框架的发展历史

99 阅读3分钟

Spring 框架的发展历史

Spring 框架自 2003 年首次发布以来,已经成为 Java 企业级应用开发中最流行的框架之一。它由 Rod Johnson 创建,并由 Pivotal Software(现为 VMware 的一部分)维护。Spring 框架的发展可以分为几个重要的阶段:

  1. Spring 1.x (2003-2005)

    • 核心特性:依赖注入(Dependency Injection, DI)、面向切面编程(Aspect-Oriented Programming, AOP)、事务管理。
    • 主要目标:简化企业级 Java 开发,提供轻量级的解决方案。
  2. Spring 2.x (2006-2009)

    • 增强功能:引入了注解配置(如 @Autowired@Service 等),进一步减少了 XML 配置。
    • 模块化:增加了更多模块,如 Spring MVC、Spring Security 等。
    • 支持 Java 5+:利用 Java 5 的新特性,如泛型和注解。
  3. Spring 3.x (2009-2013)

    • 全面支持 Java 5+:引入了基于 Java 配置的类(如 @Configuration@Bean)。
    • REST 支持:增强了对 RESTful Web 服务的支持。
    • 改进的表达式语言:引入了 SpEL(Spring Expression Language)。
  4. Spring 4.x (2013-2017)

    • 支持 Java 8:充分利用 Java 8 的新特性,如 Lambda 表达式和 Stream API。
    • 响应式编程:引入了 Spring WebFlux,支持响应式编程模型。
    • 云原生支持:与 Cloud Foundry 和其他云平台集成更加紧密。
  5. 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.xSpring 3.x:可以使用内嵌的 Tomcat 或 Jetty 启动应用。
    • Spring Boot:可以直接运行 main 方法启动应用,内置了嵌入式服务器。
  • 生产就绪特性

    • Spring 1.xSpring 2.x:需要额外配置监控和管理功能。
    • Spring 3.x:提供了更多的监控和管理工具。
    • Spring Boot:自带了许多生产就绪的特性,如 Actuator 用于监控和管理应用。

通过这些对比可以看出,Spring 框架随着版本的演进,不断简化配置、提高开发效率,并且增加了许多现代化的功能,使得开发者能够更专注于业务逻辑的实现。