Spring 开发随笔
Spring 核心概念
Spring 有哪些核心模块
- Spring 的核心模块
| 模块名称 | 主要功能 | 是否需要 Web 容器 |
|---|---|---|
| spring-core | 提供 Spring 框架的核心工具类,如资源管理、反射工具、类型转换等,是所有模块的基础依赖。 | ❌ 不需要 |
| spring-beans | 实现 IoC 容器 的 Bean 定义、创建和依赖注入功能。 | ❌ 不需要 |
| spring-context | 在 spring-beans 基础上提供更高级功能:国际化、事件发布、注解驱动 IoC 容器、ApplicationContext。 | ❌ 不需要 |
| spring-expression (SpEL) | Spring 表达式语言,可用于配置文件、注解中动态计算值。 | ❌ 不需要 |
| spring-aop | 提供 面向切面编程 (AOP) 功能,如事务、日志记录、性能监控等横切逻辑。 | ❌ 不需要 |
| spring-aspects | 集成 AspectJ,提供更强大的 AOP 功能。 | ❌ 不需要 |
| spring-jdbc | 封装 JDBC,提供简化的数据库访问方式和异常处理机制。 | ❌ 不需要 |
| spring-tx | 事务管理模块,支持编程式事务和声明式事务。 | ❌ 不需要 |
| spring-orm | 集成 ORM 框架,如 Hibernate、MyBatis、JPA。 | ❌ 不需要 |
| spring-jms | 集成 JMS 消息服务,如 ActiveMQ、RabbitMQ。 | ❌ 不需要 |
| spring-messaging | 抽象消息传递模型,支持 STOMP、WebSocket 等。 | ❌ 不需要 |
| spring-web | Web 基础功能:文件上传、Servlet 工具类、HTTP 客户端、REST 支持。 | ✅ 需要 |
| spring-webmvc | Spring MVC 核心,实现基于 Servlet 的 Web 应用开发(控制器、视图解析等)。 | ✅ 需要 |
| spring-webflux | 响应式 Web 框架,基于 Reactor,支持 Netty、Tomcat 等服务器。 | ⚠️ 可选,默认 Netty |
| spring-test | 提供 Spring 应用的单元测试、集成测试支持。 | ❌ 不需要 |
| spring-instrument | 提供类加载器工具,支持运行时字节码增强(如 JPA Lazy Loading)。 | ❌ 不需要 |
| spring-context-support | 提供额外的集成支持,如邮件发送、缓存、任务调度。 | ❌ 不需要 |
| spring-jcl | Spring 自带的日志门面,支持桥接到 SLF4J、Log4j。 | ❌ 不需要 |
- Spring 模块的常用组合
| 场景 | 必需模块 | 可选模块 |
|---|---|---|
| 纯 Java 应用 | spring-core、spring-beans、spring-context | spring-aop、spring-expression |
| 数据库应用 | + spring-jdbc、spring-tx | spring-orm |
| Web 应用 (传统) | + spring-web、spring-webmvc | spring-messaging |
| Web 应用 (响应式) | + spring-webflux | spring-messaging |
| 消息系统 | + spring-jms、spring-messaging | spring-context-support |
@Autowired 和 @Resource 的区别
在 Spring 中,@Autowired 和 @Resource 注解都可以用来实现依赖注入,两者的不同点如下:
- 来源不同
@Autowired是 Spring 提供的注解@Resource是 Java EE 提供的注解
- 依赖查找顺序不同
@Autowired会先根据类型查找,如果根据类型查找不到或者查找到多个 Bean,则会根据名称进行查找@Resource会先根据名称查找,如果根据名称查找不到,则会根据类型进行查找,如果最后查找不到,则会报错
- 支持的参数不同
@Autowired只支持required参数@Resource支持name和type等 7 个参数
- 依赖注入的方式不同
@Autowired支持构造方法注入、属性注入、Setter 注入@Resource只支持属性注入和 Setter 注入
- 编译器提示不同
- 在 IntelliJ IDEA 中,
@Autowired提供了更好的 IDE 提示 - 在 IntelliJ IDEA 中,
@Resource的 IDE 提示相对较弱
- 在 IntelliJ IDEA 中,
- 使用细节不同
@Autowired可以配合@Qualifier一起使用,用于指定具体要注入的 Bean 的名称- 当
@Autowired查找到多个符合类型的 Bean 时,可以使用@Primary修饰特定的 Bean,这样该 Bean 就会被优先用来注入 - 在默认情况下,
@Autowired要求依赖对象必须存在,如果需要允许 Null 值,可以设置它的required属性为false
总结
- 更多内容建议阅读 《@Autowired 和 @Resource 的区别》。
- 一般来说,
@Autowired更常用一些,因为它支持根据类型和名称进行自动装配,并且可以结合@Qualifier注解使用,而@Resource注解主要用于 Java EE 环境,例如 EJB 容。
常见使用问题
@RequestBody 注解抛出异常
问题描述:使用
@RequestBody注解时,抛出异常信息 “Required request body is missing”
采用 SSM 框架,前端将参数传递给后端,SpringMVC 可以通过注解 @RequestBody 将传递参数绑定在 Controller 的方法参数中。此时必须注意,当请求方法声明为 GET 和 DELETE 的时候,HTTP 请求规范里规定是不会有 RequestBody 的,只有请求方法声明为 POST 和 PUT 的时候才有,因此 @RequestBody 不适用于 GET 与 DELETE 方法。还有如果请求方法声明为 GET、DELETE,那么 SpringMVC 可以直接将传递参数绑定在方法的参数中,如果请求方法声明为 POST、PUT,则必须使用注解 @RequestBody 修饰 Controller 中的方法参数,否则无法获取前端传递过来的参数值。正确的使用方法如下:
1 |
|
