管理员创建用户需要发送激活邮件, 而发送激活邮件的时候需要判断发件人是不是合法的用户, 因此设计到一个循环依赖的问题

//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循环依赖,设计上的优化的更多相关文章

  1. 搭建DAO层和Service层代码

    第一部分建立实体和映射文件 1 通过数据库生成的实体,此步骤跳过,关于如何查看生成反向工程实体类查看SSH框架搭建教程-反向工程章节 Tmenu和AbstractorTmenu是按照数据库表反向工程形 ...

  2. 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖

    本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...

  3. Spring 循环依赖

    循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不 ...

  4. 这个 Spring 循环依赖的坑,90% 以上的人都不知道

    1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题.这里权且称他非典型Spring ...

  5. 帮助你更好的理解Spring循环依赖

    网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...

  6. spring 循环依赖的一次 理解

    前言: 在看spring 循环依赖的问题中,知道原理,网上一堆的资料有讲原理. 但今天在看代码过程中,又产生了疑问. 疑问点如下: // 疑问点: 先进行 dependon 判断String[] de ...

  7. 一张图彻底搞懂Spring循环依赖

    1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...

  8. 高频面试题:一张图彻底搞懂Spring循环依赖

    1 什么是循环依赖? 如下图所示: BeanA类依赖了BeanB类,同时BeanB类又依赖了BeanA类.这种依赖关系形成了一个闭环,我们把这种依赖关系就称之为循环依赖.同理,再如下图的情况: 上图中 ...

  9. Springboot源码分析之Spring循环依赖揭秘

    摘要: 若你是一个有经验的程序员,那你在开发中必然碰到过这种现象:事务不生效.或许刚说到这,有的小伙伴就会大惊失色了.Spring不是解决了循环依赖问题吗,它是怎么又会发生循环依赖的呢?,接下来就让我 ...

随机推荐

  1. Appium1.6启动iOS真机

      前提:已经安装了Appium1.6版本,我这里用的是GUI版本   环境要求: 真机iOS9.3及以上 macOS 10.11或10.12 Xcode7及以上   安装步骤如下 第一步:iOS真机 ...

  2. 一、Blender/Python 快速入门

    原文:https://docs.blender.org/api/blender_python_api_current/info_quickstart.html#native-types 1 前言 可以 ...

  3. vmware 完全关闭时间同步

    参考 http://blog.51cto.com/hezhang/1535577 修改.vmx文件 tools.syncTime = "FALSE" time.synchroniz ...

  4. cdh5.13.1 hadoop hdfs HA模式无法启动

    经过观察日志发现,JN三个节点启动正常,只有NN节点启动时提示JN节点没有格式化 停止HDFS下面所有服务 先启动JN节点 然后启动一个NN节点,观察三个JN节点日志 发现其中一个节点的日志正常,没有 ...

  5. Python+Selenium学习--alert/confirm/prompt 处理

    场景 webdriver 中处理JavaScript 所生成的alert.confirm 以及prompt 是很简单的.具体思路是使用switch_to.alert()方法定位到alert/confi ...

  6. mysql中插入序列表

    利用序列表来实现列转行:CREATE TABLE sequence(id INT UNSIGNED NOT NULL auto_increment PRIMARY KEY)往里面插入数据 INSERT ...

  7. 最近读jdk源码一些基础的总结(有待后续深入)

    第一点:java.lang 1.Object类,hashCode()方法,equals()方法,clone()方法,toString()方法,notify()和notifyAll()方法,wait() ...

  8. Reportviewer中的函数使用——打印当前日期并格式化

    如2017-10-23 12:20:20 通过DateTime.Now.ToString("yyMMddHHmmss")变为 20171023122020字符串

  9. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  10. Win7系统不能记忆窗口大小与位置解决方法

    似在某此系统优化后,无意发现系统在注销或重启后,打开资源管理器,它以默认大小及位置显示. 对于习惯自定义操作来说,甚为不便,遍找方法未有奏效者,但总萦绕心头,时时记起. 今日再找问题解决方法,难兄难弟 ...