Spring Boot:抽取用户权限校验方法至独立类是否推荐?求优化设计
方案建议
1. 抽取到独立类是完全推荐的方案
你的思路完全可行,把重复的角色校验、参数填充逻辑抽成独立类,能直接解决代码冗余问题,大幅提升可维护性。具体实现可以这么做:
- 新建一个业务服务类(比如
UserSearchContextHandler),将updateSearchInformation改为公共方法,通过构造注入依赖的classroomService和DataUtilService:
@Component public class UserSearchContextHandler { private final ClassroomService classroomService; private final DataUtilService dataUtilService; public UserSearchContextHandler(ClassroomService classroomService, DataUtilService dataUtilService) { this.classroomService = classroomService; this.dataUtilService = dataUtilService; } public AdminUserSearchDto updateSearchInformation(CustomUserDetails userDetails, Long classroomId, Integer year) { if(Role.TEACHER.getValue().equals(userDetails.getRole())) { classroomId = classroomService.findClassroomByAdminUserId(userDetails.getId()) .orElseThrow(() -> new GlobalException(ExceptionMessage.TEACHER_NOT_ASSIGNED)) .getId(); year = dataUtilService.getYearData(); } return AdminUserSearchDto.builder() .classroomId(classroomId) .year(year) .build(); } }
- 在需要该逻辑的服务类中,注入
UserSearchContextHandler直接调用方法即可,无需重复编写逻辑。
2. 其他更有效的替代策略
自定义注解 + AOP 切面
如果该逻辑是多个服务方法执行前的参数预处理步骤,可以用AOP统一拦截:
- 定义自定义注解(比如
@FillSearchContext) - 编写切面类,拦截带有该注解的方法,在方法执行前完成角色校验和参数填充,将处理后的
AdminUserSearchDto传入方法或存入上下文
这种方式能进一步减少业务代码中的调用代码,让逻辑与业务方法解耦。
策略模式(适配未来角色扩展)
如果后续要新增更多角色的处理规则(比如学生、管理员的不同参数逻辑),可以用策略模式拆分:
- 定义
SearchContextStrategy接口,包含updateSearchInformation方法 - 为每个角色实现对应的策略类(比如
TeacherSearchStrategy、AdminSearchStrategy) - 编写策略工厂类,根据用户角色动态获取对应策略实例执行逻辑
这种方式能让不同角色的逻辑解耦,后续扩展新角色时无需修改原有代码,符合开闭原则。
DTO静态构建方法(仅适用于无外部依赖的场景)
如果逻辑相对简单且无外部服务依赖,也可以把逻辑封装到AdminUserSearchDto的静态构建方法中,但要注意这种方式会让DTO依赖业务逻辑,违反单一职责,仅适合简单场景。
内容的提问来源于stack exchange,提问作者geon
相关产品推荐
相关产品推荐

