Bootstrap

Spring的JavaWeb三层架构

Spring 三层架构的核心注解及协作

在 Spring 的 JavaWeb 三层架构中,通过分层注解实现职责分离和组件管理,各层(表现层、业务层、数据访问层)的协作基于 组件扫描依赖注入(DI) 机制。以下是各层的核心注解及其协作关系:


1. 分层架构与对应注解

层级职责注解关联技术
表现层处理用户请求,返回响应@Controller/@RestControllerSpring MVC, RESTful API
业务层实现业务逻辑,协调多个数据操作@Service事务管理(@Transactional
数据访问层与数据库交互,执行CRUD操作@RepositorySpring Data JPA, JDBC, MyBatis

2. 注解间的协作关系

(1) @Controller 与 @Service:HTTP请求处理链路
  • 工作流程

    1. 客户端发起请求,@Controller 的 @RequestMapping(或其衍生注解如 @GetMapping)映射到对应方法。
    2. @Controller 调用 @Service 层方法处理业务逻辑。
    3. @Service 执行逻辑后返回结果,@Controller 组织响应(如 JSON 或视图)。

      依赖注入

    4. @Controller 通过 @Autowired 注入 @Service 实现类
      @RestController
      public class UserController {
          @Autowired
          private UserService userService; // 注入业务层组件
      
          @GetMapping("/user/{id}")
          public User getUser(@PathVariable Long id) {
              return userService.findUserById(id);
          }
      }
      

(2) @Service 与 @Repository:事务性业务逻辑

总结

Spring 的三层架构通过 @Controller@Service@Repository 分离不同职责,依赖 @Autowired 实现层间协作,结合 @ComponentScan 实现 Bean 的自动装配。这种设计不仅降低了系统复杂性,还提高了扩展性和可维护性。在实际开发中,如需更细粒度控制(如多数据源或分布式事务),还可通过 @Qualifier 或自定义注解进一步优化。


  • 工作流程

    1. @Service 调用 @Repository 的方法进行数据库操作(如查询、更新)。
    2. @Service 通过 @Transactional 实现事务管理,确保数据一致性。
  • 依赖注入

  • @Service 通过 @Autowired 注入 @Repository 实现类:

  • 3. 分层注解的核心协作机制

    (1) 组件扫描与自动装配
  • 组件扫描
    Spring 通过 @ComponentScan(默认包含在 @SpringBootApplication 中)扫描 @Controller@Service@Repository,将类实例化为 Bean。
  • 自动装配
    @Autowired 基于类型或名称(结合 @Qualifier)自动注入依赖,实现层间解耦。
  • (2) Bean 的管理范畴
    注解典型使用位置管理范畴
    @ControllerMVC 控制器类处理请求、响应视图或数据
    @Service业务逻辑实现类业务逻辑封装与事务控制
    @Repository数据库访问类(DAO/JPA)异常转换(如将SQL异常转为Spring统一异常)
    (3) 协作示例
  • // 数据访问层(Repository)
    @Repository
    public class UserRepositoryImpl implements UserRepository {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        public User findById(Long id) {
            // 执行数据库查询
        }
    }
    
    // 业务层(Service)
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserRepository userRepository; 
    
        @Override
        @Transactional
        public User findUserById(Long id) {
            return userRepository.findById(id);
        }
    }
    
    // 表现层(Controller)
    @RestController
    public class UserController {
        @Autowired
        private UserService userService;
    
        @GetMapping("/user/{id}")
        public User getUser(@PathVariable Long id) {
            return userService.findUserById(id);
        }
    }

    4. 分层协作的优势

  • 职责清晰
    • 各层专注单一职责(如Controller处理请求,Service实现业务逻辑)。
  • 高内聚低耦合
    • 通过依赖注入解耦,修改某层实现不影响其他层(例如更换数据库时仅需调整@Repository)。
  • 易维护与测试
    • 单元测试时可用 Mock 工具(如 Mockito)单独测试 Service 层,无需依赖真实数据库。
;