浅谈spring使用策略模式实现多种场景登录方式

网友投稿 592 2022-11-14

浅谈spring使用策略模式实现多种场景登录方式

浅谈spring使用策略模式实现多种场景登录方式

@Autowired注解可以帮我们自动注入我们想要的 Bean。

如果只是简单使用@Autowired会遇到spring IOC容器中一个接口有多个实现的情况,spring无法识别具体的实现类,如果不是策略模式,我们可以进行具体的指定@Qualifier和@primary来避免bean冲突的情况。但在策略模式中是不行的。

而除了这个基本功能之外, @Autowired 还有更加强大的功能,还可以注入指定类型的数组,List/Set 集合,甚至还可以是 Map 对象。

为每个具体的实现类添加了一个编号,方便识别,具体可以根据场景选择,这里只是模拟。

登录service

@Sehttp://rvice

public class LoginService {

@Autowired

Set loginSet;//使用了Set

Map loginMap;

public User login(User userLogin) {

Login login=loginMap.get(userLogin.getChannelNo());

return login.login(userLogin);

}

@PostConstruct

public void init() {

loginMap = new HashMap<>();

for (Login login : loginSet) {

loginMap.put(login.channel(), login);

}

}

}

源码策略接口

@Component

public interface Login {

User login(User userLogin);

Integer channel();

}

具体实现类---用户密码登录

@Component

public class PasswordLogin implements Login {

@Autowired

LoginDao loginDao;

@Override

public User login(User userLogin) {

return loginDao.PasswordLogin(userLogin.getUsername(),userLogin.getPassword());

}

@Override

public Integer channel() {

return 2;

}

}

具体实现类---邮箱登录

@Component

public class EmailLogin implements Login {

@Autowired

LoginDao loginDao;

@Override

public User login(User userLogin) {

return loginDao.EmailLogin(userLogin.getEmail(),userLogin.getPassword());

}

@Override

public Integer channel() {

return 3;

}

}

具体实现类---邮箱登录

@Component

public class PhoneLogin implements Login {

@Autowired

LoginDao loginDao;

@OvePryPTkHfZtrride

public User login(User userLogin) {

return loginDao.PhoneLogin(userLogin.getPhone(),userLogin.getPassword());

}

@Override

public Integer channel() {

return 1;

}

}

简单模拟登录SQL

@Mapper

@Repository

public interface LoginDao {

@Select("select * from user where phone=#{phone} and password=#{password}")

User PhoneLogin(String phone,String password);

@Select("select * from user where username=#{username} and password=#{password}")

User PasswordLogin(String username,String password);

@Select("select * from user where email=#{email} and password=#{password}")

User EmailLogin(String email,String password);

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ros学习笔记10——rostopic中增加时间戳功能
下一篇:这款国产API神器工具也太强了吧...让我放弃了postman
相关文章

 发表评论

暂时没有评论,来抢沙发吧~