Java-Spring入门指南(七)Spring三层架构
Java-Spring入门指南(七)Spring三层架构
前言
在上一篇博客中,我们掌握了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
| 非常感谢您的阅读,喜欢的话记得三连哦 |

更多推荐


所有评论(0)