【SpringBoot学习】36、SpringBoot 使用 @RequiredArgsConstructor 替换 @Autowired 分析

@RequiredArgsConstructor 替换 @Autowired 分析

小有一些时日没有写文章了,最新有点小匆忙,继续分享、学习,各位小伙伴加油!

1、注解注入分析

首先确定,我们为什么需要使用 @Autowired 注解?@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。对 Spring Bean 这块不熟悉的,可以看【Spring 源码分析】这个系列的文章

@RequiredArgsConstructor 是 lombok 提供的注解,作用于类,用于生成包含 final 和 @NonNull 注解的成员变量的构造方法。那么也就是说,我们需要在注入的属性上增加 final 或 @NonNull 修饰就可以了

Spring 中三种注入方式、

第一种:Field Injection:属性注入,这种注入方式通过 Java 的反射机制实现,所以 private 的成员也可以被注入具体的对象

第二种:Constructor Injection 构造注入,通过对象构建的时候建立关系,所以这种方式对对象创建的顺序会有要求,当然 Spring 会为你搞定这样的先后顺序,除非你出现循环依赖,然后就会抛出异常

第三种:Setter Injection set 注入,通过调用成员变量的 set 方法来注入想要使用的依赖对象

喜欢深入研究的同学,可以看这三种注入的对比

2、实例分析

项目中的@Autowired 注解,有黄色提示,根据提示修改代码之后,

鼠标放上去看到提示使用构造方法注入

有两种形式,第一种,直接创建空构造,实际上是将属性修改为 final。第二种,每个属性的注入都在构造方法上增加一个参数,如下

第二种代码太臃肿了,并且很繁琐,所以这里我们使用第一种方式,final 构造,于是代码变成了以下格式


到此,简单的 SpringBoot 使用 @RequiredArgsConstructor 替换 @Autowired 分析就结束啦!

微信公众号

<think>嗯,用户想了解Spring Boot中业务层的设计与实现,还要求示例。我需要先理清业务层的概念和常见设计模式。业务层通常指服务层,处理业务逻辑,协调数据访问层和控制器层。常见的模式有MVC中的Service层,或者领域驱动设计中的领域服务。 首先,业务层设计要注意单一职责原则,每个服务类负责一个明确的业务功能。接着,可能需要依赖注入来管理服务之间的依赖,比如使用Spring@Autowired注解。然后,事务管理也是关键,确保业务操作的数据一致性,可以通过@Transactional注解实现。 用户可能需要具体的代码示例,所以得准备一个简单的业务场景,比如用户管理模块。包括用户注册、查询等基本功能。需要展示服务接口、实现类,以及与数据访问层(Repository)的交互。 还要考虑异常处理,比如自定义业务异常,统一处理异常信息。此外,单元测试也是业务层的重要部分,可以用JUnit和Mockito来模拟依赖,测试服务逻辑。 参考用户提供的引用,虽然大部分是关于RocketMQ、WebSocket、Redis消息队列和监控的内容,但可能没有直接相关的业务层示例。不过可以结合Spring Boot的一般实践,比如使用@Service注解标记服务类,@Repository标记数据访问层,以及如何通过Spring Data JPA简化数据库操作。 用户可能还想知道如何分层设计,比如Controller调用Service,Service调用Repository,这样的分层结构。需要解释每层的职责,并给出代码结构示例。同时,可以提到使用DTO(数据传输对象)来封装数据,避免直接暴露实体类。 另外,事务管理部分需要详细说明,比如在服务方法中添加@Transactional,确保数据库操作的事务性。如果涉及多个Repository操作,事务管理能保证原子性。 可能还需要提到服务层的接口和实现分离的好处,比如方便后续扩展和替换实现。或者使用设计模式如策略模式、工厂模式来增强业务层的灵活性。 最后,示例代码的结构要清晰,展示如何从Controller到Service再到Repository的调用流程。可以结合用户提到的引用中的配置,比如Spring Boot的启动类配置,数据源的配置等,但重点放在业务层的实现上。 总结下来,回答应该包括业务层的设计原则、关键实现技术(依赖注入、事务管理)、代码结构示例、异常处理、单元测试,以及相关的最佳实践。确保示例代码符合Spring Boot的惯例,并解释各部分的作用,帮助用户理解如何在实际项目中设计和实现业务层。</think>### Spring Boot业务层设计与实现分步解析 #### 一、业务层核心设计原则 1. **单一职责原则**:每个Service类仅处理单一业务领域,如`UserService`处理用户相关业务 2. **接口分离原则**:推荐使用接口+实现类模式,便于扩展和维护 3. **事务边界控制**:使用`@Transactional`注解明确事务管理边界[^3] 4. **依赖注入**:通过`@Autowired`实现松耦合的组件协作 #### 二、典型分层结构 ```text src/main/java └── com.example ├── controller # 表现层 ├── service # 业务层 │ ├── impl # 实现类 │ └── dto # 数据传输对象 └── repository # 数据访问层 ``` #### 三、基础实现示例(用户管理模块) 1. **服务接口定义** ```java public interface UserService { UserDTO registerUser(UserRegistrationDTO dto); UserDTO getUserById(Long id); void deactivateUser(Long id); } ``` 2. **服务实现类** ```java @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; @Override public UserDTO registerUser(UserRegistrationDTO dto) { if(userRepository.existsByUsername(dto.getUsername())) { throw new BusinessException("用户名已存在"); } User user = new User(); user.setUsername(dto.getUsername()); user.setPassword(passwordEncoder.encode(dto.getPassword())); return UserDTO.fromEntity(userRepository.save(user)); } @Override @Transactional(readOnly = true) public UserDTO getUserById(Long id) { return userRepository.findById(id) .map(UserDTO::fromEntity) .orElseThrow(() -> new NotFoundException("用户不存在")); } } ``` 3. **事务管理说明** - `@Transactional`注解默认对RuntimeException进行回滚 - `readOnly=true`优化查询性能 - 嵌套事务使用`Propagation.REQUIRES_NEW` #### 四、高级设计技巧 1. **领域驱动设计(DDD)应用** ```java @Service public class OrderService { @Autowired private DomainEventPublisher eventPublisher; public void completeOrder(Long orderId) { Order order = orderRepository.findById(orderId) .orElseThrow(NotFoundException::new); order.complete(); eventPublisher.publish(new OrderCompletedEvent(order)); } } ``` 2. **组合服务模式** ```java @Service @RequiredArgsConstructor public class CompositeService { private final UserService userService; private final AuditService auditService; public UserDTO createUserWithAudit(UserRegistrationDTO dto) { UserDTO user = userService.registerUser(dto); auditService.logAction(ActionType.USER_CREATED, user.getId()); return user; } } ``` #### 五、性能优化实践 1. **缓存应用** ```java @Service @CacheConfig(cacheNames = "users") public class UserServiceImpl implements UserService { @Override @Cacheable(key = "#id") public UserDTO getUserById(Long id) { // 数据库查询逻辑 } } ``` 2. **异步处理** ```java @Service public class NotificationService { @Async public void sendWelcomeEmail(UserDTO user) { // 异步发送邮件逻辑 } } ``` #### 六、单元测试示例 ```java @ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserServiceImpl userService; @Test void shouldRegisterUserSuccessfully() { UserRegistrationDTO dto = new UserRegistrationDTO("test", "password"); when(userRepository.existsByUsername("test")).thenReturn(false); UserDTO result = userService.registerUser(dto); assertNotNull(result); verify(userRepository).save(any(User.class)); } } ``` #### 七、最佳实践建议 1. 使用DTO隔离实体类与接口层 2. 业务异常统一继承`RuntimeException` 3. 关键业务操作记录审计日志 4. 使用Spring Boot Actuator进行健康监控[^4] 5. 复杂业务采用领域事件驱动设计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tellsea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值