浅谈spring使用策略模式实现多种场景登录方式
@Autowired注解可以帮我们自动注入我们想要的 Bean。
如果只是简单使用@Autowired会遇到spring IOC容器中一个接口有多个实现的情况,spring无法识别具体的实现类,如果不是策略模式,我们可以进行具体的指定@Qualifier和@primary来避免bean冲突的情况。但在策略模式中是不行的。
而除了这个基本功能之外, @Autowired 还有更加强大的功能,还可以注入指定类型的数组,List/Set 集合,甚至还可以是 Map 对象。
为每个具体的实现类添加了一个编号,方便识别,具体可以根据场景选择,这里只是模拟。
登录service
@Service public class LoginService { @Autowired Set<Login> loginSet;//使用了Set Map<Integer,Login> 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; @Override 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); }
到此这篇关于spring使用策略模式实现多种场景登录方式的文章就介绍到这了,更多相关spring 策略模式登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring boot中filter类不能注入@Autowired变量问题
这篇文章主要介绍了Spring boot中filter类不能注入@Autowired变量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-09-09springcloud之Feign、ribbon如何设置超时时间和重试机制
这篇文章主要介绍了springcloud之Feign、ribbon如何设置超时时间和重试机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
最新评论