Spring框架最初由Rod Johnson于2003年发布,它的初衷是为了简化企业级Java开发。当时,Java EE开发中存在大量冗长配置和沉重的EJB(Enterprise JavaBeans)架构,开发效率低、可维护性差。Spring通过引入“控制反转”(IoC)和“面向切面编程”(AOP)等核心理念,为Java开发带来了一场革命。
Spring逐步发展为一个全方位的企业级开发平台,从最初的IoC容器逐渐扩展出Web框架(Spring MVC)、数据访问(Spring JDBC, Spring Data)、安全(Spring Security)、消息服务(Spring Messaging)等子项目。到了2025年,Spring已成为Java开发的事实标准,并拥有Spring Boot、Spring Cloud等强大的扩展生态系统。
2003年:Spring框架首次发布。
2004年:Spring 1.0 发布,正式引起业界关注。
2013年:Spring Boot 发布,极大简化配置与部署。
2015年:Spring 4.x 全面支持Java 8。
2018年:Spring 5引入WebFlux响应式编程模型。
2023年后:Spring 6全面支持Java 17+和Jakarta EE,强调Kubernetes友好与云原生特性。
2025年:Spring持续推进模块化、响应式与云原生集成。
Spring的优势不止在于其技术能力,更重要的是其设计哲学与实际应用场景的高度匹配。以下是Spring被广泛采用的核心原因:
松耦合设计:基于IoC和DI,使得模块之间依赖最小化,便于测试与维护。
模块化架构:每个模块独立可用,按需组合,满足不同项目需求。
高度可扩展:提供丰富的扩展点与SPI机制。
广泛生态支持:包括Spring Boot、Spring Cloud、Spring Security等,几乎涵盖所有企业应用需求。
主流框架集成良好:如MyBatis、Hibernate、Kafka、Redis等,Spring提供原生或官方支持。
支持多种配置方式:XML、注解、Java Config,适应不同风格。
测试友好:提供Spring Test模块支持单元测试与集成测试。
Spring的设计理念核心可总结为以下几点:
开发者不再主动创建对象并管理依赖关系,而是由Spring容器统一负责对象的生命周期和依赖注入。这种模式有助于解耦代码、提升可测试性。
Spring通过AOP技术将横切关注点(如事务、日志、安全等)从业务逻辑中剥离出来,增强代码的关注点分离(Separation of Concerns)。
Spring框架保持高度一致的API设计风格,并尽量做到非侵入性(POJO友好),即业务代码无需依赖Spring特定接口,也能被Spring容器管理。
通过注解或配置方式,实现事务管理、安全控制、缓存等功能的声明式开发,降低开发复杂度。
Spring倡导面向接口的设计方式,有利于系统可扩展性与可测试性。
Spring框架采用清晰的分层架构设计,可分为以下几层:
核心容器(Core Container)层:包括Core、Beans、Context、Expression Language模块,提供IoC与DI的实现。
数据访问/集成(Data Access/Integration)层:包括JDBC、ORM、JMS、Transactions模块。
Web层:包括Web、Web MVC、Web Reactive模块,处理Web请求与响应。
AOP与工具层:提供AOP支持与各种通用工具类库。
测试层:Spring Test模块提供测试支持。
这种分层结构使得Spring具有极高的可扩展性与可维护性,每一层都可以单独使用,也可以与其他层协作组合使用。
Spring的模块设计遵循松耦合与高内聚原则。以下是常见的协作关系:
Context 模块依赖于 Beans 模块:Context是对Beans模块的扩展,提供更高级的IoC容器能力,如事件发布、国际化等。
AOP 模块可独立使用或与Context结合使用:如声明式事务管理依赖于AOP实现。
Web 模块通常结合Context与DI使用:例如Controller中的依赖自动注入。
事务管理可独立使用,也可整合到Web与数据访问模块中。
假设我们有一个Spring MVC应用,其中使用了以下模块协同:
Controller(Web模块)接收请求
Service(Context + AOP模块)处理业务逻辑并启用事务
DAO(Data Access模块)访问数据库
这种架构的优势是:各层关注点清晰,便于维护和测试。
Spring框架的核心模块为整个系统提供基础支撑,主要包括以下几个:Core、Beans、Context 和 SpEL(表达式语言)。理解这些模块对于掌握IoC容器的工作机制至关重要。
Core模块是整个Spring框架的基础,它包含了框架的基本核心工具类,最重要的是提供了IoC(控制反转)和依赖注入的基础设施。
提供 BeanFactory
接口,这是Spring中最基本的IoC容器。
提供资源访问(Resource接口)和类型转换(TypeConverter)等通用服务。
提供属性解析器、工具类(如Assert、StringUtils等)。
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class CoreExample {
public static void main(String[] args) {
// 创建一个BeanFactory容器
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyService service = (MyService) factory.getBean("myService");
service.doSomething();
}
}
注意:
XmlBeanFactory
已被废弃,建议使用 ApplicationContext,示例仅用于展示 Core 模块基本用途。
Beans模块构建在Core模块之上,是IoC容器的核心实现。它负责Bean的定义、创建、依赖注入等。
定义和管理 Bean 的生命周期。
提供 Bean 的依赖注入(Setter、构造器等方式)。
读取配置(XML、注解等)生成 BeanDefinition。
public class MyService {
private String name;
public void setName(String name) {
this.name = name;
}
public void doSomething() {
System.out.println("Hello, " + name);
}
}
Context模块是对Core和Beans的进一步封装,提供了更完整的IoC容器实现(ApplicationContext),并支持国际化、事件发布、资源访问等高级功能。
提供 ApplicationContext
接口,增强BeanFactory。
支持国际化(MessageSource)。
支持ApplicationEvent事件发布机制。
支持注解扫描、自动装配等功能。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ContextExample {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyService service = context.getBean(MyService.class);
service.doSomething();
}
}
Spring表达式语言(SpEL)是Spring 3.0引入的,用于在运行时查询和操作对象图,是配置和注解中强大的表达能力扩展。
支持属性访问、方法调用、算术运算、条件判断等。
可在XML配置、注解中使用。
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.Expression;
public class SpelExample {
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();
System.out.println(message); // 输出 Hello World!
}
}
AOP(面向切面编程)模块用于实现横切关注点逻辑,如事务、日志、安全控制等。
提供切点(Pointcut)、通知(Advice)、切面(Aspect)等机制。
支持基于代理的AOP实现(JDK动态代理与CGLIB)。
与Spring容器无缝集成。
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("调用方法: " + joinPoint.getSignature().getName());
}
}
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example")
public class AppConfig {}
Aspects模块为与AspectJ集成提供支持,主要提供注解与织入支持。
@Aspect
@Before
、@After
、@Around
等通知类型
@Pointcut
用于定义切点表达式
此模块是实现声明式事务、缓存等功能的基础。
Instrumentation模块提供类加载器增强支持,常用于Java代理、性能监控、类字节码修改等高级应用。
Spring Instrument与JMX结合,增强应用性能监控能力。
在某些容器中(如Tomcat、Glassfish)优化ClassLoader行为。
Messaging模块是Spring 4引入的,提供对消息传递的抽象支持。
基于MessageChannel、MessageHandler构建的消息通道模型。
与Spring Integration、Spring AMQP等整合使用。
Message message = MessageBuilder.withPayload("Hello")
.setHeader("priority", 9)
.build();
Web模块提供构建Web应用的基础设施,主要包括Servlet API抽象、Web应用上下文(WebApplicationContext)等。
DispatcherServlet:前端控制器
HandlerMapping:请求到控制器方法的映射
ViewResolver:视图解析器
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello Spring MVC!";
}
}
Web Reactive模块(即WebFlux)自Spring 5引入,支持响应式非阻塞编程模型。
基于Project Reactor实现(Mono/Flux)。
支持函数式与注解式编程模型。
适用于高并发场景。
@RestController
public class ReactiveController {
@GetMapping("/flux")
public Flux helloFlux() {
return Flux.just("A", "B", "C").delayElements(Duration.ofSeconds(1));
}
}
Test模块为Spring应用提供测试支持,包括单元测试与集成测试。
@RunWith(SpringRunner.class)
集成JUnit
@SpringBootTest
启动整个Spring上下文进行集成测试
MockMvc 提供对Web层的测试能力
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void testDoSomething() {
assertEquals("Expected Result", myService.doSomething());
}
}
Spring框架最核心的理念之一是控制反转(IoC)和依赖注入(DI)。这套机制让对象的创建和依赖管理从程序代码中解耦,交由Spring容器自动完成,大大提升了系统的可测试性、灵活性与维护性。
IoC(Inversion of Control)指的是对象创建权的转移——传统由开发者new出来的对象,由容器来创建与管理。这种机制不仅让组件之间的依赖关系变得可控,也使得组件更容易被替换与扩展。
BeanFactory
:最基本的容器,延迟加载,轻量但功能有限。
ApplicationContext
:功能更强大,支持国际化、事件传播、自动装配等。
配置(XML、注解、Java Config)中定义Bean及其依赖关系。
容器在初始化时解析配置并构建对象图。
应用运行期间从容器中获取Bean实例,而不是自己new。
依赖注入(Dependency Injection)是IoC的具体实现方式,指的是由容器将依赖注入到对象中。
构造器注入:通过构造函数传入依赖。
Setter注入:通过setter方法传入依赖。
注解注入:使用@Autowired
、@Inject
等注解实现自动注入。
@Component
public class UserService {
private final UserRepository repository;
public UserService(UserRepository repository) {
this.repository = repository;
}
}
@Component
public class UserService {
private UserRepository repository;
@Autowired
public void setRepository(UserRepository repository) {
this.repository = repository;
}
}
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
}
@Autowired(required = false)
:依赖可选
@Qualifier("beanName")
:指定具体的Bean名称
@Primary
:多个Bean冲突时优先选择的Bean
@Component
public class UserRepository {}
@Service
public class UserService {
@Autowired
private UserRepository repository;
}
@Configuration
public class AppConfig {
@Bean
public UserRepository userRepository() {
return new UserRepository();
}
@Bean
public UserService userService() {
return new UserService(userRepository());
}
}
降低类之间的耦合
提升系统的灵活性、可测试性
支持多种配置方式(注解、Java Config、XML)
实现“关注点分离”,聚焦业务逻辑
Spring框架提供了三种主要的配置方式:XML配置、注解配置和Java配置(基于Java类的配置)。随着Spring版本的演进,配置方式也逐渐从繁琐走向简洁与自动化。
XML配置是Spring最早期的配置方式,虽然现在已经逐渐被替代,但在一些企业老项目中依然占有一席之地。
配置集中、可视化清晰。
对于工具友好(如Spring IDE、STS)。
不侵入业务代码。
编写繁琐,易出错。
难以维护与扩展。
与代码解耦,可能导致配置与代码不同步。
Spring 2.5 开始引入注解配置方式,大大提升了开发效率。注解配置将Bean定义放入代码中,与业务逻辑更紧密结合。
@Component
:通用组件
@Service
:业务逻辑层组件
@Repository
:持久层组件
@Controller
:Web层控制器
@Autowired
:自动注入依赖
@Qualifier
:指定注入名称
@Value
:注入值或配置属性
@Repository
public class UserRepository {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
简洁明了,减少配置代码。
可与Java代码紧密结合,提高开发效率。
配置分散,不易集中管理。
与代码耦合,可能影响可移植性。
Java配置方式在Spring 3.0开始引入,Spring 4.x及之后成为推荐方式,特别适合与Spring Boot配合使用。
@Configuration
:声明配置类
@Bean
:声明Bean方法
@ComponentScan
:开启组件扫描
@Import
:导入其他配置类
@Configuration
@ComponentScan("com.example")
public class AppConfig {
@Bean
public UserRepository userRepository() {
return new UserRepository();
}
@Bean
public UserService userService() {
return new UserService(userRepository());
}
}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService service = context.getBean(UserService.class);
强类型检查,IDE 友好,重构方便。
无需额外XML配置,代码即配置。
易于组织复杂配置。
初期学习成本略高。
对纯XML配置用户存在迁移门槛。
方式 | 优点 | 缺点 | 推荐使用场景 |
---|---|---|---|
XML配置 | 解耦、集中、传统项目支持好 | 配置繁琐、易出错 | 旧项目/配置分离需求 |
注解配置 | 简洁、直观、快速开发 | 配置分散、代码耦合 | 中小型项目、初学者 |
Java配置 | 强类型、可组合、结构清晰 | 初期复杂、迁移成本 | 新项目、Spring Boot |
新项目推荐使用Java配置或注解配置。
尽量避免使用XML配置,除非与老系统集成。
使用@ConfigurationProperties
代替@Value
进行集中式配置管理。
Spring Boot项目建议使用纯Java配置,保持配置统一性与可测试性。
Spring 在 Web 开发中提供了完整的支持,核心是 Spring MVC
模块。它基于 DispatcherServlet 实现请求分发、控制器映射、视图解析、数据绑定等功能,是现代 Java Web 应用的首选架构之一。
Spring MVC 是一种基于模型-视图-控制器(Model-View-Controller)设计模式的 Web 框架。其核心组件 DispatcherServlet 作为前端控制器,负责统一处理所有 HTTP 请求。
用户发起 HTTP 请求。
DispatcherServlet 拦截请求。
通过 HandlerMapping 找到对应的 Controller。
Controller 执行业务逻辑,返回 ModelAndView。
ViewResolver 解析视图名称。
DispatcherServlet 渲染视图并返回响应给用户。
DispatcherServlet
是整个 Spring MVC 的核心入口。
它由 Web 容器加载,自动读取 web.xml
或 SpringBootServletInitializer
注册的配置。
加载应用上下文,初始化 Controller、ViewResolver、HandlerMapping 等组件。
@SpringBootApplication
public class WebApp {
public static void main(String[] args) {
SpringApplication.run(WebApp.class, args);
}
}
在 Spring MVC 中,Controller 负责处理具体的业务请求。
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
public String createUser(@RequestBody User user) {
userService.save(user);
return "创建成功";
}
}
Spring MVC 提供了强大的参数绑定和数据校验支持。
@RequestParam
:绑定查询参数
@PathVariable
:绑定路径变量
@RequestBody
:绑定请求体 JSON
@ModelAttribute
:绑定表单对象
@PostMapping("/register")
public String register(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
return "参数校验失败";
}
userService.save(user);
return "注册成功";
}
Spring 提供了多种视图技术(JSP、Thymeleaf、FreeMarker等)支持。
@Configuration
public class WebConfig {
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setPrefix("/templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
return resolver;
}
}
Spring 5 引入 WebFlux,支持响应式编程模型,适用于高并发、非阻塞应用场景。
基于 Reactor 模型,支持背压机制。
完全非阻塞,适用于微服务、网关等高性能场景。
支持注解风格与函数式风格。
@Configuration
public class RouterConfig {
@Bean
public RouterFunction route(UserHandler handler) {
return RouterFunctions
.route(GET("/user/{id}"), handler::getUser)
.andRoute(POST("/user"), handler::saveUser);
}
}
在企业应用中,数据访问层(DAO)至关重要。Spring 框架通过一套统一的抽象模型,简化了数据库访问的复杂性,提供了从低层 JDBC 到高层 ORM 的丰富支持。
Spring 提供了 JdbcTemplate
,用于简化 JDBC 操作,避免手动管理连接、关闭资源等繁琐步骤。
自动资源管理(Connection、Statement、ResultSet)
防止 SQL 注入
支持回调机制,简化操作
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public User findById(Long id) {
return jdbcTemplate.queryForObject(
"SELECT * FROM users WHERE id = ?",
new BeanPropertyRowMapper<>(User.class),
id
);
}
public int save(User user) {
return jdbcTemplate.update(
"INSERT INTO users (name, email) VALUES (?, ?)",
user.getName(), user.getEmail()
);
}
}
相比 JdbcTemplate,它使用具名参数,增强了 SQL 可读性。
@Autowired
private NamedParameterJdbcTemplate namedJdbc;
public int updateEmail(Long id, String email) {
String sql = "UPDATE users SET email = :email WHERE id = :id";
Map params = new HashMap<>();
params.put("id", id);
params.put("email", email);
return namedJdbc.update(sql, params);
}
Spring 提供声明式与编程式事务管理,默认使用 AOP 实现,支持多种事务管理器,如 DataSourceTransactionManager
、JpaTransactionManager
。
@Service
public class OrderService {
@Transactional
public void placeOrder(Order order) {
orderRepository.save(order);
paymentService.charge(order);
}
}
TransactionTemplate template = new TransactionTemplate(transactionManager);
template.execute(status -> {
orderDao.save(order);
return null;
});
Spring 对主流 ORM 框架如 Hibernate、JPA、MyBatis 提供集成支持。
Spring 提供 LocalSessionFactoryBean
支持 Hibernate 配置。
@Configuration
public class HibernateConfig {
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource());
factory.setPackagesToScan("com.example.model");
Properties props = new Properties();
props.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
factory.setHibernateProperties(props);
return factory;
}
}
Spring Data JPA 是对 JPA 的封装,简化了接口定义与实现。
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
// getter/setter
}
public interface UserRepository extends JpaRepository {
List findByNameContaining(String keyword);
}
Spring Data 提供对 MongoDB、Redis、Elasticsearch、Neo4j 等 NoSQL 数据库的统一封装。
Spring Data JPA:面向关系型数据库
Spring Data MongoDB:文档型数据库支持
Spring Data Redis:缓存数据库支持
@Document
public class Article {
@Id
private String id;
private String title;
private String content;
}
public interface ArticleRepository extends MongoRepository {
List findByTitleContaining(String keyword);
}
Spring 提供了完整的测试生态,涵盖单元测试、集成测试和 Web 层模拟等多种场景。借助 Spring Test 模块,开发者可以方便地在不启动完整服务的前提下验证业务逻辑、数据访问和控制器行为。
单元测试:独立验证 Java 类的方法逻辑,无需 Spring 上下文。
集成测试:使用 @SpringBootTest
等注解加载容器,测试 Bean 间协作。
Web 测试:利用 MockMvc
模拟 HTTP 请求,验证控制器响应。
事务测试:使用 @Transactional
自动回滚数据库操作,避免污染数据。
使用 spring-boot-starter-test
统一引入测试依赖。
利用 @MockBean
替换依赖,实现隔离测试。
搭配 JUnit5、Mockito 进行行为验证。
精简上下文,提升测试速度。
针对 Repository 层使用 @DataJpaTest
。
Web 层建议使用 @WebMvcTest
搭配 MockMvc
。
使用测试专用配置类 @TestConfiguration
提供定制 Bean。
本章回顾 Spring 的核心结构,并结合实际开发经验提出最佳实践建议,帮助开发者在项目中合理运用 Spring。
Spring 包含多个模块:
核心容器(Core、Beans、Context)
数据访问(JDBC、JPA、事务)
Web 支持(MVC、WebFlux)
AOP 与集成
测试支持模块
这些模块构建出一个强大而灵活的开发平台,适配从单体应用到微服务的多种架构形态。
模块分层清晰:遵循 Controller-Service-Repository 架构。
优先注解配置:简化 XML,提升开发效率。
集中异常处理:使用 @ControllerAdvice
管理全局错误。
规范事务管理:明确边界,防止数据不一致。
重视测试体系:测试覆盖核心业务,持续集成更可靠。
Spring Native 与 GraalVM 的融合提升性能和部署效率。
对响应式编程、K8s 云原生支持愈加完善。
新模块(如 Spring AI、DataFlow)扩展应用场景。
Spring 不仅仅是一个框架,而是 Java 企业开发的基石。通过良好的架构设计、灵活的模块组合和完善的生态支持,Spring 提供了解决业务复杂性的优雅方案。
无论是新手还是资深工程师,深入理解 Spring 的原理与最佳实践,将是走向高级 Java 开发不可或缺的一步。
本文旨在为读者建立完整的Spring容器知识体系,但更细致的内容(如高级生命周期扩展、自定义注入逻辑、BeanFactoryPostProcessor用法、Spring Context的事件机制等)将在本专栏后续文章中逐一展开。
建议读者关注本专栏,按照文章顺序持续学习,你将逐步掌握Spring框架最深层的运行机制与设计哲学。