service层代码相互调用, 导致spring循环依赖,设计上的优化
管理员创建用户需要发送激活邮件, 而发送激活邮件的时候需要判断发件人是不是合法的用户, 因此设计到一个循环依赖的问题
//UserService
@Service
class UserService{
@Autowired
private MailService mailService;
@Autowired
private UserMapper userMapper;
public void createUser(User user){
//创建用户
userMapper.save(user);
//发送邮件
mailService.send(xxxx);
}
//判断用户是否合法
public boolean isExist(String userId){//.... userMapper.xxxx}
}
//MailService
@Service
class MailService{
@Autowired
private UserService userService;
public void send(Mail mail){
//判断发件人是否存在
String currentUserId = SessionContext.getCurrentUser().getUserId();
if(!userService.isExist(currentUserId)){
//用户不存在抛异常
}
//send mail
}
}
改良:提出一个辅助的service,或者将
UserService 替换成UserMapper
//UserServiceHelper
@Service
class UserServiceHelper{
@Autowired
private UserMapper userMapper;
//判断用户是否合法
public boolean isExist(String userId){//.... userMapper.xxxx}
}
@Service
class MailService{
@Autowired
private UserServiceHelper userServiceHelper; //这里不同了
public void send(Mail mail){
//判断发件人是否存在
String currentUserId = SessionContext.getCurrentUser().getUserId();
if(!userServiceHelper.isExist(currentUserId)){
//用户不存在抛异常
}
//send mail
}
}
有人会说注入 UserMapper 不就行了, 是可以但是每次都调用Mapper的方法较为麻烦, 即使只多一行代码, 但是这种代码是没有语义化的
tip:
发送邮件和判断用户是否存在是两个独立的部分,不应该紧耦合在一起;重写一个单独的service,专门用来表达用户发送邮件,最敏捷的是放到controller里处理
UserService {
// CRUD
boolean isExists(String userId);
}
MailService {
void send(Mail mail);
}
UserExistsCheckMailService {
UserService userService;
MailService mailService;
void send(Mail mail) {
if (!userService.isExists(...)) {
throw Exception;
}
mailService.send()
}
}
Tip:service自身调用自身也属于调用的循环,serviceX有两个方法,一个A,一个B,A里调用B,则自己造成循环,解耦办法:将A方法拆解,放到controller里或
将B方法放到不掉用serviceX里的方法的其他sevcie类里
service层代码相互调用, 导致spring循环依赖,设计上的优化的更多相关文章
- 搭建DAO层和Service层代码
第一部分建立实体和映射文件 1 通过数据库生成的实体,此步骤跳过,关于如何查看生成反向工程实体类查看SSH框架搭建教程-反向工程章节 Tmenu和AbstractorTmenu是按照数据库表反向工程形 ...
- 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...
- Spring 循环依赖
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不 ...
- 这个 Spring 循环依赖的坑,90% 以上的人都不知道
1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题.这里权且称他非典型Spring ...
- 帮助你更好的理解Spring循环依赖
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...
- spring 循环依赖的一次 理解
前言: 在看spring 循环依赖的问题中,知道原理,网上一堆的资料有讲原理. 但今天在看代码过程中,又产生了疑问. 疑问点如下: // 疑问点: 先进行 dependon 判断String[] de ...
- 一张图彻底搞懂Spring循环依赖
1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...
- 高频面试题:一张图彻底搞懂Spring循环依赖
1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...
- Springboot源码分析之Spring循环依赖揭秘
摘要: 若你是一个有经验的程序员,那你在开发中必然碰到过这种现象:事务不生效.或许刚说到这,有的小伙伴就会大惊失色了.Spring不是解决了循环依赖问题吗,它是怎么又会发生循环依赖的呢?,接下来就让我 ...
随机推荐
- xnconvert 图片转换工具
xnconvert是一款简单高效的图片转换工具.xnconvert能够批量地进行图片格式转换,并具有一定的图片处理功能,可以增加水印.特效,支持放大缩小.旋转等. xnconvert功能介绍: 你可以 ...
- oracleXE数据库没有公开wm_concat函数, 需要手动添加
CREATE OR REPLACE TYPE wm_concat_impl AUTHID CURRENT_USER AS OBJECT ( curr_str ), STATIC FUNCTION od ...
- js实现简单拖拽效果
方法如下: var params = { left: 0, top: 0, currentX: 0, currentY: 0, flag: false }; var getCss = function ...
- cloudstack4.11+KVM+4网卡bond5+briage 交换机不作配置
网卡绑定配置 # cat ifcfg-em1TYPE=EthernetBOOTPROTO=noneDEVICE=em1ONBOOT=yesMASTER=bond0SLAVE=yes# cat ifcf ...
- Ant 之 Task
Ant提供了大量的核心task和可选task,除此之外,Ant还允许用户定义自己的task,这大大扩展了Ant的功能.本书由于篇幅关系,所以不可能详细介绍Ant所有的核心task和可选task,本书将 ...
- git和svn的对比
- CodeForces - 920C Swap Adjacent Elements
传送门:点我 You have an array a consisting of n integers. Each integer from 1 to n appears exactly once i ...
- 164. Maximum Gap (Array; sort)
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- roof
roof - 必应词典 美[ruf]英[ruːf] n.屋顶:车顶:顶部:有…顶的 v.给…盖顶:盖上屋顶 网络房顶:楼顶:屋脊 变形复数:roofs:过去分词:roofed:现在分词:roofing ...
- Python开发【第四篇】:模块
双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*- USER_INFO = {} de ...