前言

在上一篇博客中,我们掌握了Spring注解驱动开发的核心能力——通过@Component@Autowired等注解摆脱XML配置,让Bean注册和依赖注入更“智能化”。

  • 但实际企业项目中,代码并非零散的类,而是遵循“分层架构”组织的:前端请求由控制层接收,业务逻辑在服务层处理,数据操作交给数据访问层,实体类封装数据…

这种“三层架构(Controller→Service→Dao)+ 实体层(Pojo)”是Java企业开发的经典模式。Spring如何通过注解让各层高效协作?如何用@Controller@Service@Repository等注解替代通用的@Component,让代码分层更清晰?

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482

在这里插入图片描述

一、Spring三层架构概述

在企业级Web应用中,Spring的三层架构通常分为:

在这里插入图片描述

层级 职责 Spring注解(核心)
Controller(控制层) 接收前端请求,调用Service处理,返回响应(如Spring MVC的Controller) @Controller
Service(业务层) 封装业务逻辑,协调多个Dao完成复杂业务,是“逻辑中枢” @Service
Dao(数据访问层) 直接操作数据库(或数据源),负责CRUD(增删改查) @Repository
Pojo(实体层) 封装数据(如数据库表对应的Java对象),是各层间传递数据的“载体” @Component(或@Entity等)

这些注解本质上都是@Component的“衍生注解”,作用是明确类的分层角色,让代码可读性和维护性更强(相比通用的@Component,别人一看@Service就知道是业务层)。

二、三层架构注解实战

2.1 Pojo层:实体类封装数据

Pojo(Plain Old Java Object,简单Java对象)是各层间传递数据的载体,通常对应数据库中的表。

实战:User实体类

package com.niit.pojo;

import org.springframework.stereotype.Component;

// @Component:将User类注册为Spring的Bean,供其他层注入
@Component
public class User {
    private Integer id;
    private String username;
    private String password;

    // Getter、Setter、toString省略,实际开发需编写
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

2.2 Dao层:数据访问操作

Dao层负责与数据库交互(这里以模拟数据为例,实际会用MyBatis等持久层框架)。

实战:UserDao接口与实现类
首先定义接口(规范方法):

package com.niit.dao;

import com.niit.pojo.User;

public interface UserDao {
    // 根据ID查询用户
    User findById(Integer id);
    // 保存用户
    void save(User user);
}

然后编写实现类,用@Repository标记(告诉Spring这是数据访问层Bean):

package com.niit.dao;

import com.niit.pojo.User;
import org.springframework.stereotype.Repository;

// @Repository:标记为数据访问层Bean,Spring会扫描并管理
@Repository
public class UserDaoImpl implements UserDao {

    @Override
    public User findById(Integer id) {
        // 模拟从数据库查询(实际会用JDBC/MyBatis等)
        User user = new User();
        user.setId(id);
        user.setUsername("test_user_" + id);
        user.setPassword("123456");
        return user;
    }

    @Override
    public void save(User user) {
        // 模拟保存到数据库,打印日志表示执行了保存
        System.out.println("用户【" + user.getUsername() + "】已保存到数据库");
    }
}

2.3 Service层:业务逻辑封装

Service层封装业务逻辑,依赖Dao层完成数据操作,是“逻辑中枢”。

实战:UserService接口与实现类
接口定义:

package com.niit.service;

import com.niit.pojo.User;

public interface UserService {
    // 根据ID查询用户(调用Dao)
    User findUserById(Integer id);
    // 注册用户(调用Dao保存)
    void register(User user);
}

实现类用@Service标记,并通过@Autowired注入UserDao:

package com.niit.service;

import com.niit.dao.UserDao;
import com.niit.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

// @Service:标记为业务层Bean,Spring扫描后管理
@Service
public class UserServiceImpl implements UserService {

    // @Autowired:自动注入UserDao类型的Bean(UserDaoImpl已被@Repository标记)
    @Autowired
    private UserDao userDao;

    @Override
    public User findUserById(Integer id) {
        // 调用Dao查询用户,可在此添加业务逻辑(如权限判断、日志记录等)
        return userDao.findById(id);
    }

    @Override
    public void register(User user) {
        // 业务逻辑:如密码加密(这里简化,直接调用Dao保存)
        userDao.save(user);
    }
}

2.4 Controller层:请求处理与响应

Controller层接收外部请求(如HTTP请求),调用Service处理,再返回结果(如Spring MVC中返回视图或JSON)。

实战:UserController
@Controller标记,并通过@Autowired注入UserService:

package com.niit.controller;

import com.niit.pojo.User;
import com.niit.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

// @Controller:标记为控制层Bean,处理请求(若结合Spring MVC,还需配置DispatcherServlet等)
@Controller
public class UserController {

    // @Autowired:自动注入UserService类型的Bean(UserServiceImpl已被@Service标记)
    @Autowired
    private UserService userService;

    // 模拟处理“查询用户”请求
    public User handleFindUser(Integer id) {
        // 调用Service查询用户
        User user = userService.findUserById(id);
        System.out.println("Controller查询到用户:" + user);
        return user;
    }

    // 模拟处理“用户注册”请求
    public void handleRegister(User user) {
        // 调用Service注册用户
        userService.register(user);
        System.out.println("Controller处理用户注册请求完成");
    }
}

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-Spring入门指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13040333.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

更多推荐