当前位置: 首页 > news >正文

Spring核心概念指南

🌱 Spring核心概念完全指南

新手友好的Spring框架核心概念详解,包含Bean、DTO、Entity、JPA和事务管理等

📋 目录

  • 🫘 Bean - Spring的核心对象管理
  • 📦 DTO - 数据传输对象
  • 🏗️ Entity - 实体类
  • 🛠️ JPA - Java持久化API
  • 🔄 事务管理
  • 🏭 工厂模式在Spring中的应用
  • 📋 Spring常见注解
  • 📁 项目结构规范
  • 💡 最佳实践

🫘 Bean - Spring的核心对象管理

💡 概念

Bean = Spring工厂管理的对象

Bean是Spring容器创建、管理和销毁的Java对象。Spring通过注解和反射机制实现自动化的依赖注入。

🎯 核心作用

  • 统一管理对象生命周期:Spring负责创建、初始化、销毁对象
  • 自动解决依赖关系:通过@Autowired自动注入依赖
  • 单例模式管理:默认Bean都是单例,节省内存

📝 代码示例

// 传统方式:手动管理依赖
public class OrderController {public void createOrder() {UserService userService = new UserService();           // 手动创建 ❌PaymentService paymentService = new PaymentService();   // 手动创建 ❌EmailService emailService = new EmailService();         // 手动创建 ❌OrderService orderService = new OrderService(userService, paymentService, emailService);}
}// Spring方式:自动管理
@RestController
public class OrderController {@Autowiredprivate OrderService orderService;  // Spring自动注入 ✅@PostMapping("/orders")public void createOrder() {orderService.createOrder();  // 直接使用}
}

🏷️ Bean创建方式

// 方式1:注解方式(推荐)
@Service
@Component
@Repository
@Controller
public class UserService { }// 方式2:配置类方式
@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {return new HikariDataSource();}
}

📦 DTO - 数据传输对象

💡 概念

DTO (Data Transfer Object) = 数据传输的载体

DTO是专门用来在不同层之间传输数据的对象,就像快递盒一样,只装需要传输的数据。

🎯 核心作用

  • 数据安全:过滤敏感信息(如密码)
  • 按需传输:只传输必要的字段
  • 接口规范:定义前后端数据交互格式
  • 数据聚合:将多个实体的数据组合成一个传输对象

📝 代码示例

// Entity:完整的数据库映射
@Entity
public class User {private Long id;private String username;private String password;      // 敏感信息private String email;private LocalDateTime createTime;private String address;// ...20多个字段
}// DTO:按需传输
public class UserDisplayDTO {private Long id;private String username;private String email;// 只包含展示需要的字段,去掉敏感信息
}public class UserCreateDTO {@NotBlank(message = "用户名不能为空")private String username;@Size(min = 6, message = "密码至少6位")private String password;@Email(message = "邮箱格式不正确")private String email;// 只包含创建用户需要的字段
}

🔄 典型使用场景

@RestController
public class UserController {// 接收前端数据@PostMapping("/users")public ResponseData createUser(@RequestBody UserCreateDTO dto) {User user = convertToUser(dto);  // DTO → EntityuserService.save(user);return ResponseData.success();}// 返回前端数据@GetMapping("/users/{id}")public ResponseData<UserDisplayDTO> getUser(@PathVariable Long id) {User user = userService.findById(id);    // EntityUserDisplayDTO dto = convertToDTO(user); // Entity → DTOreturn ResponseData.success(dto);}
}

🏗️ Entity - 实体类

💡 概念

Entity = 数据库表的Java映射对象

实体类是数据库表在Java代码中的代表,实现对象关系映射(ORM)。

🎯 关系图解

数据库表 users:              ←→     Java实体类 User:
┌─────────────────┐                ┌─────────────────┐
│ id (BIGINT)     │       ←→       │ Long id         │
│ username (VARCHAR)│     ←→       │ String username │
│ email (VARCHAR) │       ←→       │ String email    │
│ create_time (DATETIME)│ ←→       │ LocalDateTime   │
└─────────────────┘                └─────────────────┘

📝 代码示例

@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username", nullable = false, length = 50)private String username;@Column(name = "email", unique = true)private String email;@CreatedDate@Column(name = "create_time")private LocalDateTime createTime;@Enumerated(EnumType.STRING)private UserStatus status;// 关联关系@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)private List<Order> orders;
}

🔄 数据流转

// 查询:数据库 → Entity
User user = userRepository.findById(1L);// 保存:Entity → 数据库
User newUser = new User();
newUser.setUsername("zhangsan");
userRepository.save(newUser);

🛠️ JPA - Java持久化API

💡 概念

JPA = Java与数据库之间的翻译官

JPA是Java持久化的标准API,提供对象关系映射(ORM)功能,让开发者可以用面向对象的方式操作数据库。

🎯 核心功能

  • 自动SQL生成:根据方法名生成SQL语句
  • 对象关系映射:Java对象与数据库表的自动映射
  • 事务管理:自动处理事务的开启、提交、回滚
  • 缓存机制:提供一级和二级缓存

📝 代码示例

// Repository接口
@Repository
public interface UserRepository extends JpaRepository<User, Long> {// JPA自动生成实现// 根据方法名自动生成SQLList<User> findByUsername(String username);// 生成:SELECT * FROM users WHERE username = ?List<User> findByEmailContaining(String keyword);// 生成:SELECT * FROM users WHERE email LIKE %keyword%@Query("SELECT u FROM User u WHERE u.createTime > :date")List<User> findRecentUsers(@Param("date") LocalDateTime date);
}// 使用示例
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public List<User> searchUsers(String keyword) {return userRepository.findByEmailContaining(keyword);}
}

🏗️ JPA vs 传统JDBC

// 传统JDBC:手写SQL
public class UserDao {public User findById(Long id) {String sql = "SELECT * FROM users WHERE id = ?";PreparedStatement ps = connection.prepareStatement(sql);ps.setLong(1, id);ResultSet rs = ps.executeQuery();User user = new User();user.setId(rs.getLong("id"));user.setUsername(rs.getString("username"));// ...手动映射每个字段 ❌return user;}
}// JPA:自动处理
@Repository
public interface UserRepository extends JpaRepository<User, Long> {// 什么都不用写,JPA自动生成SQL和对象映射 ✅
}

🔄 事务管理

💡 概念

事务 = 一组操作要么全成功,要么全失败

Spring通过AOP(面向切面编程)和动态代理技术,在方法执行前后自动添加事务管理代码。

🎯 ACID特性

  • 原子性(Atomicity):要么全成功,要么全失败
  • 一致性(Consistency):数据保持一致状态
  • 隔离性(Isolation):不同事务互不干扰
  • 持久性(Durability):成功后数据永久保存

📝 基本使用

@Service
public class UserService {@Transactional  // 一个注解搞定事务管理public void transferMoney(Long fromUserId, Long toUserId, BigDecimal amount) {// Spring自动开启事务userRepository.deductBalance(fromUserId, amount);  // 扣钱if (amount.compareTo(BigDecimal.valueOf(10000)) > 0) {throw new RuntimeException("转账金额过大!");  // Spring自动回滚}userRepository.addBalance(toUserId, amount);       // 加钱// Spring自动提交事务}
}

🌊 事务传播行为

// REQUIRED(默认):有事务就加入,没有就创建
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() { }// REQUIRES_NEW:总是创建新事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() { }// SUPPORTS:有事务就加入,没有就不用事务
@Transactional(propagation = Propagation.SUPPORTS)
public void methodC() { }

🔙 回滚规则

// 默认:RuntimeException和Error自动回滚
@Transactional
public void defaultRollback() {throw new RuntimeException("自动回滚"); // ✅ 回滚throw new IOException("不会回滚");      // ❌ 不回滚
}// 自定义回滚规则
@Transactional(rollbackFor = Exception.class)
public void customRollback() {throw new IOException("也会回滚"); // ✅ 回滚
}

🏃‍♂️ Spring事务执行原理

// Spring AOP代理实际执行的逻辑(简化版)
public Object executeWithTransaction() {TransactionStatus txStatus = null;try {// 1. 开始事务txStatus = transactionManager.getTransaction(txDefinition);// 2. 执行业务方法Object result = targetMethod.invoke();// 3. 提交事务transactionManager.commit(txStatus);return result;} catch (RuntimeException | Error e) {// 4. 回滚事务transactionManager.rollback(txStatus);throw e;}
}

🏭 工厂模式在Spring中的应用

💡 概念

Spring提供便利机制让工厂模式实现更简单,但核心的工厂逻辑仍需自己实现。

🔧 Spring提供的便利 vs 需要自己写的

功能Spring提供你需要写
扫描实现类@ComponentScan
创建实例@Service等注解
收集实例@Autowired List<>
接口定义
具体实现
工厂查找逻辑

📝 实现示例

// 1. 定义接口
public interface PaymentHandler {void process(Payment payment);PaymentType getType();  // 标识方法
}// 2. 具体实现
@Service
public class WechatPaymentHandler implements PaymentHandler {@Overridepublic PaymentType getType() {return PaymentType.WECHAT;}
}@Service
public class AlipayPaymentHandler implements PaymentHandler {@Overridepublic PaymentType getType() {return PaymentType.ALIPAY;}
}// 3. 工厂类
@Service
public class PaymentHandlerFactory {@Autowiredprivate List<PaymentHandler> allHandlers;  // Spring自动收集所有实现// 核心工厂逻辑需要自己写public PaymentHandler getHandler(PaymentType type) {return allHandlers.stream().filter(handler -> handler.getType() == type).findFirst().orElse(null);}
}

📋 Spring常见注解

🏷️ 组件注解

@Component      // 通用组件
@Service        // 业务层
@Repository     // 数据访问层
@Controller     // 控制层
@RestController // REST控制器 = @Controller + @ResponseBody
@Configuration  // 配置类

🔧 依赖注入注解

@Autowired      // 自动装配
@Resource       // 按名称注入
@Qualifier      // 指定具体Bean
@Value          // 注入配置值// 示例
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Value("${app.name}")private String appName;
}

🌐 Web相关注解

@RequestMapping   // 映射请求路径
@GetMapping      // GET请求
@PostMapping     // POST请求
@RequestBody     // 请求体转Java对象
@ResponseBody    // Java对象转响应体
@PathVariable    // 路径参数
@RequestParam    // 请求参数

🔍 验证注解

@NotBlank(message = "不能为空")
@Size(min = 3, max = 20, message = "长度3-20字符")
@Email(message = "邮箱格式不正确")
@Min(value = 18, message = "年龄不能小于18岁")

📁 项目结构规范

🏗️ 包结构

com.company.project
├── controller/          ← 控制器层
│   ├── UserController.java
│   └── OrderController.java
├── service/            ← 业务逻辑层
│   ├── UserService.java
│   ├── UserServiceImpl.java
│   └── OrderService.java
├── repository/         ← 数据访问层
│   ├── UserRepository.java
│   └── UserRepositoryImpl.java
├── entity/            ← 实体类
│   ├── User.java
│   └── Order.java
├── dto/               ← 数据传输对象
│   ├── UserDTO.java
│   ├── UserCreateDTO.java
│   └── UserUpdateDTO.java
├── config/            ← 配置类
│   └── AppConfig.java
└── util/              ← 工具类└── DateUtil.java

🏷️ 命名规范

// Controller层
UserController, OrderController// Service层  
UserService, UserServiceImpl// Repository层
UserRepository, UserRepositoryImpl// DTO层
UserDTO, UserCreateDTO, UserUpdateDTO// Entity层
User, Order, Product// 配置类
DatabaseConfig, RedisConfig

💡 最佳实践

✅ 推荐做法

// 1. 面向接口编程
@Autowired
private UserService userService;  // 注入接口,不是实现类// 2. 使用构造器注入(推荐)
@Service
public class OrderService {private final UserService userService;private final PaymentService paymentService;public OrderService(UserService userService, PaymentService paymentService) {this.userService = userService;this.paymentService = paymentService;}
}// 3. 事务范围尽量小
@Transactional
public void createOrder(Order order) {// 只包含数据库操作orderRepository.save(order);
}// 4. 读操作使用只读事务
@Transactional(readOnly = true)
public List<Order> getUserOrders(Long userId) {return orderRepository.findByUserId(userId);
}

❌ 避免的做法

// 1. 避免循环依赖
@Service
public class AService {@Autowiredprivate BService bService;
}@Service
public class BService {@Autowiredprivate AService aService;  // ❌ 循环依赖
}// 2. 避免在Service中直接操作HTTP
@Service
public class UserService {public void updateUser(HttpServletRequest request) {  // ❌ 不好// Service层不应该知道HTTP相关}
}// 3. 避免事务范围过大
@Transactional
public void processOrder(Order order) {orderRepository.save(order);emailService.sendEmail();     // ❌ 不需要事务的操作pdfService.generatePdf();     // ❌ 耗时操作
}

🎯 核心关系图

前端请求 → Controller → Service → Repository → Entity → 数据库↓          ↓         ↓DTO        Bean      JPA↓          ↓         ↓数据传输    依赖注入   事务管理

📚 学习建议

  1. 先理解概念:Bean、DTO、Entity、JPA的作用
  2. 动手实践:创建简单的CRUD项目
  3. 理解原理:AOP、反射、代理模式
  4. 掌握注解:@Service、@Autowired、@Transactional等
  5. 学习最佳实践:代码规范、项目结构

🎉 掌握这些核心概念,你就能理解大部分Spring项目的架构和代码组织方式了!

http://www.lryc.cn/news/588152.html

相关文章:

  • Linux部署Mysql
  • (LeetCode 每日一题) 1290. 二进制链表转整数 (链表+二进制)
  • 微前端框架深度对决:qiankun、micro-app、wujie 技术内幕与架构选型指南
  • 艺术总监的构图“再造术”:用PS生成式AI,重塑照片叙事框架
  • 网络协议和基础通信原理
  • Bash vs PowerShell | 从 CMD 到跨平台工具:Bash 与 PowerShell 的全方位对比
  • 隐藏源IP的核心方案与高防实践
  • VNC和Socket
  • IP相关
  • 水务工程中自动化应用:EtherNet/IP转PROFIBUS DP连接超声波流量计
  • 从0到1实现Shell!Linux进程程序替换详解
  • 创客匠人谈知识变现:IP 变现的核心,在于执行闭环的落地
  • 更改elementui 图标 css content
  • 修改crontab默认编辑器
  • 多线程是如何保证数据一致和MESI缓存一致性协议
  • 一种用于医学图像分割的使用了多尺寸注意力Transformer的混合模型: HyTransMA
  • 从“有”到“优”:iPaaS 赋能企业 API 服务治理建设
  • FastAPI-P1:Pydantic模型与参数额外信息
  • Linux中使用云仓库上传镜像和私库制作Registry
  • Android系统的问题分析笔记 - Android上的调试方式 debuggerd
  • 超导探索之术语介绍:费曼图(Feynman Diagram)
  • 【基础架构】——架构设计流程第三步(评估和选择备选方案)
  • 8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核
  • 现代数据平台能力地图:如何构建未来数据平台的核心能力体系
  • LSV负载均衡
  • org.casic.javafx.control.PaginationPicker用法
  • 2025年北京市大学生程序设计竞赛暨“小米杯”全国邀请赛——D
  • 【从语言幻觉看趋势】从语言幻觉到多智能体协作:GPT多角色系统的技术演进与实践路径
  • MFC UI大小改变与自适应
  • MFC扩展库BCGControlBar Pro v36.2新版亮点:可视化设计器升级