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↓ ↓ ↓数据传输 依赖注入 事务管理
📚 学习建议
- 先理解概念:Bean、DTO、Entity、JPA的作用
- 动手实践:创建简单的CRUD项目
- 理解原理:AOP、反射、代理模式
- 掌握注解:@Service、@Autowired、@Transactional等
- 学习最佳实践:代码规范、项目结构
🎉 掌握这些核心概念,你就能理解大部分Spring项目的架构和代码组织方式了!