Spring框架是2003年兴起的一个轻量级Java开发框架,由Rod Johnson在其经典著作中阐述的理念衍生而来,旨在解决企业应用开发的复杂性。作为分层的JavaSE/EE一站式轻量级开源框架,Spring的核心是控制反转(IOC)和面向切面(AOP)
一、Spring框架概述 1.1 什么是Spring框架 Spring框架是一个开源的Java平台,由Rod Johnson在2003年创建。它提供了一个全面的编程和配置模型,用于构建现代基于Java的企业应用程序。
简化Java开发:通过依赖注入和面向切面编程简化企业级应用开发 解耦和模块化:帮助开发者编写松耦合、可测试的代码 企业级功能:提供事务管理、安全、缓存等企业级功能 一站式解决方案:覆盖表现层、业务层、持久层 1.2 Spring框架的优势 代码污染极低 不需要继承特定的类或实现特定的接口 可以自由选择使用Spring的哪些功能 IOC(控制反转)的核心机制 提供了bean工厂(Spring容器) 降低了业务对象替换的复杂性 提高了组件之间的解耦 将通用任务(安全、事务、日志等)集中管理 提高了代码复用性和管理的便捷性 业务逻辑与横切关注点分离 ORM和DAO提供了与第三方持久层框架的良好整合 简化了底层数据访问 支持Hibernate、MyBatis、JPA等 提供了优秀的Web MVC框架 支持RESTful API开发 灵活的视图解析 数据库事务处理 远程调用(RMI、Hessian、HTTP) JMS消息处理 JMX操作处理 不需要直接使用相关API(JDBC、JMX、JMS等) 1.3 Spring生态系统 Spring Framework:核心框架 Spring Boot:快速开发框架 Spring Cloud:微服务框架 Spring Data:数据访问抽象 Spring Security:安全框架 Spring Batch:批处理框架 Spring Integration:企业集成框架 Spring AMQP:消息队列支持 二、Spring核心概念 2.1 IOC(控制反转) IOC(Inversion of Control)即控制反转,多数书籍翻译成”控制反转”,还有些书籍翻译成为”控制反向”或者”控制倒置”。
1 2 3 4 5 6 7 8 public class UserService { private UserRepository userRepository; public UserService () { this .userRepository = new UserRepositoryImpl (); } }
1 2 3 4 5 6 @Service public class UserService { @Autowired private UserRepository userRepository; }
降低组件之间的耦合度 提高代码的可测试性 便于替换实现 统一管理对象生命周期 不需要主动查找,对象的查找、定位和创建全部由容器管理 2.2 DI(依赖注入) DI(Dependency Injection)即依赖注入,是IOC的一种实现方式。Spring的IOC容器主要使用DI方式实现。
1 2 3 4 5 6 7 8 @Service public class UserService { private final UserRepository userRepository; public UserService (UserRepository userRepository) { this .userRepository = userRepository; } }
1 2 3 4 5 6 7 8 9 @Service public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository (UserRepository userRepository) { this .userRepository = userRepository; } }
1 2 3 4 5 @Service public class UserService { @Autowired private UserRepository userRepository; }
2.3 AOP(面向切面编程) AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
日志记录:方法执行前后记录日志 事务管理:自动管理事务的开启、提交、回滚 权限控制:方法执行前检查权限 性能监控:统计方法执行时间 异常处理:统一异常处理 1 2 3 4 5 6 7 8 9 @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore (JoinPoint joinPoint) { System.out.println("执行方法: " + joinPoint.getSignature().getName()); } }
三、Spring 框架的20个模块
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,spring的IOC容器主要使用DI方式实现的。不需要主动查找,对象的查找、定位和创建全部由容器管理。spring ioc 是spring的核心,在spring中主要用户管理容器中的bean。
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。spring aop 也是spring的核心,利用aop的技术可以用来做日志、权限、缓存等功能实现。
Spring支持大多数ORM框架,比如Hibernate,JPA,JDO,TopLink和iBatis(spring2支持iBatis2,现MyBatis3的spring支持由MyBatis社区开发,并非spring)。
Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,spring MVC和Struts、Struts2非常类似。
Spring 支持集成Apache cxf、axis2、xfire等不同集中webservice实现方案。
Spring完美的支持了对事物的管理,目前主要有两种实现发难,一种是配置文件、一种是基于注解来实现。
Spring支持对activemq、RabbitMQ消息中间件的集成。
Spring Data 作为springSource的其中一个父项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。
Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。
Spring-Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
Spring Security是一个能够为基于spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在spring应用上下文中配置的Bean,充分利用了spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
Spring在schedule这块支持JDK Timer、concurrent、quartz三种,这三种任务调度方案在实现机制和调用方法上都不同,但spring通过对其包装,使得基于spring能用统一的配置和编码风格来使用这三种schedule方案。
四、第一个Spring应用 4.1 创建Maven项目 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?xml version="1.0" encoding="UTF-8" ?> <project xmlns ="http://maven.apache.org/POM/4.0.0" > <modelVersion > 4.0.0</modelVersion > <groupId > com.example</groupId > <artifactId > spring-demo</artifactId > <version > 1.0.0</version > <properties > <spring.version > 5.3.21</spring.version > <maven.compiler.source > 11</maven.compiler.source > <maven.compiler.target > 11</maven.compiler.target > </properties > <dependencies > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-context</artifactId > <version > ${spring.version}</version > </dependency > </dependencies > </project >
4.2 创建Bean类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class User { private String name; private Integer age; public String getName () { return name; } public void setName (String name) { this .name = name; } public Integer getAge () { return age; } public void setAge (Integer age) { this .age = age; } } public class UserService { public void sayHello (User user) { System.out.println("Hello, " + user.getName() + "!" ); } }
4.3 配置Spring 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?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 http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id ="user" class ="com.example.User" > <property name ="name" value ="张三" /> <property name ="age" value ="25" /> </bean > <bean id ="userService" class ="com.example.UserService" /> </beans >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Configuration @ComponentScan(basePackages = "com.example") public class AppConfig { @Bean public User user () { User user = new User (); user.setName("张三" ); user.setAge(25 ); return user; } @Bean public UserService userService () { return new UserService (); } }
4.4 使用Spring容器 1 2 3 4 5 6 7 8 9 10 11 ApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml" );User user = context.getBean("user" , User.class);UserService userService = context.getBean("userService" , UserService.class);userService.sayHello(user); ApplicationContext context = new AnnotationConfigApplicationContext (AppConfig.class);User user = context.getBean(User.class);UserService userService = context.getBean(UserService.class);userService.sayHello(user);
五、Spring注解开发 5.1 常用注解 1 2 3 4 @Component @Service @Repository @Controller
1 2 3 4 @Autowired @Qualifier @Resource @Value
1 2 3 4 @Configuration @Bean @ComponentScan @PropertySource
5.2 注解示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @Configuration @ComponentScan(basePackages = "com.example") public class AppConfig {} @Service public class UserService { @Autowired private UserRepository userRepository; public User findById (Long id) { return userRepository.findById(id); } } @Repository public class UserRepository { public User findById (Long id) { return new User (); } }
六、框架源码解析 6.1 框架版本 spring-framework-5.0.6.RELEASE(示例版本) 最新版本:Spring 6.x(需要Java 17+) 推荐版本:Spring 5.3.x(稳定版本) 6.2 核心包结构 Spring的骨架,也是Spring的核心包。主要包含三个内容:
beans包更侧重于bean实例的描述 负责Bean的定义、创建、管理 类比:演员 context更侧重全局控制,功能衍生 提供Spring框架的上下文环境 类比:导演 core包侧重于帮助类,操作工具 提供Spring框架的基础工具类 类比:道具
6.3 源码结构 1 2 3 4 5 6 7 8 9 10 11 12 spring-framework/ ├── spring-core/ # 核心工具类 ├── spring-beans/ # Bean定义和管理 ├── spring-context/ # 应用上下文 ├── spring-aop/ # AOP支持 ├── spring-expression/ # SpEL表达式 ├── spring-jdbc/ # JDBC支持 ├── spring-orm/ # ORM支持 ├── spring-tx/ # 事务支持 ├── spring-web/ # Web支持 ├── spring-webmvc/ # MVC框架 └── spring-test/ # 测试支持
6.4 Beans包(实例) BeanDefinition:Bean定义接口 BeanFactory:Bean工厂接口 BeanWrapper:Bean包装器 PropertyAccessor:属性访问器
6.5 Context包(上下文) ApplicationContext:应用上下文接口 ConfigurableApplicationContext:可配置上下文 BeanPostProcessor:Bean后处理器 ApplicationEventPublisher:事件发布器
6.6 Core包(核心工具) Resource:资源抽象接口 ResourceLoader:资源加载器 BeanDefinitionRegistry:Bean定义注册器 BeanDefinitionReader:Bean定义读取器 6.6.1 Registry(描述注册器)
6.6.2 Strategy(初始化策略)
七、下一步学习 通过本文的学习,您已经掌握了Spring框架的基础知识,包括:
Spring框架的核心概念(IOC、DI、AOP) Spring框架的模块组成 Spring的基本使用和配置 Spring注解开发 Spring框架源码结构 在下一篇文章(进阶篇)中,我们将深入学习Spring框架的高级特性,包括AOP深入、事务管理、Bean生命周期、性能优化等内容。
1 2 3 4 参考资源: - [Spring框架源码](https://github.com/Hosiang1026/spring-framework) - [简单的Spring框架实现](https://github.com/Hosiang1026/simple-spring) - [Spring官方文档](https://spring.io/projects/spring-framework)
本文标题: Spring框架入门篇
发布时间: 2023年01月28日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/21e862e1/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!