浅谈spring使用策略模式实现多种场景登录方式
@Autowired注解可以帮我们自动注入我们想要的 Bean。
如果只是简单使用@Autowired会遇到spring IOC容器中一个接口有多个实现的情况,spring无法识别具体的实现类,如果不是策略模式,我们可以进行具体的指定@Qualifier和@primary来避免bean冲突的情况。但在策略模式中是不行的。
而除了这个基本功能之外, @Autowired 还有更加强大的功能,还可以注入指定类型的数组,List/Set 集合,甚至还可以是 Map 对象。
为每个具体的实现类添加了一个编号,方便识别,具体可以根据场景选择,这里只是模拟。
登录service
@Servicepublic class LoginService {@AutowiredSetloginSet; //使用了Set Map loginMap; public User login(User userLogin) {Login login=loginMap.get(userLogin.getChannelNo()); return login.login(userLogin); }@PostConstructpublic void init() {loginMap = new HashMap<>(); for (Login login : loginSet) {loginMap.put(login.channel(), login); }}}
源码策略接口
@Componentpublic interface Login {User login(User userLogin); Integer channel(); }
具体实现类---用户密码登录
@Componentpublic class PasswordLogin implements Login {@AutowiredLoginDao loginDao; @Overridepublic User login(User userLogin) {return loginDao.PasswordLogin(userLogin.getUsername(),userLogin.getPassword()); }@Overridepublic Integer channel() {return 2; }}
具体实现类---邮箱登录
@Componentpublic class EmailLogin implements Login {@AutowiredLoginDao loginDao; @Overridepublic User login(User userLogin) {return loginDao.EmailLogin(userLogin.getEmail(),userLogin.getPassword()); }@Overridepublic Integer channel() {return 3; }}
具体实现类---邮箱登录
@Componentpublic class PhoneLogin implements Login {@AutowiredLoginDao loginDao; @Overridepublic User login(User userLogin) {return loginDao.PhoneLogin(userLogin.getPhone(),userLogin.getPassword()); }@Overridepublic Integer channel() {return 1; }}
简单模拟登录SQL
@Mapper@Repositorypublic 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 策略模式登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- C++|C++ std::shared_mutex读写锁的使用
- Java|Java 精炼解读递归的概念与使用
- Springboot集成minio实现文件存储的实现代码
- 面渣逆袭|Spring Bean生命周期,好像人的一生。。
- 从构建到使用,openLooKeng 如何实现 Hash Join ()
- Vuex详细介绍和使用方法
- 如何使用DTM将App事件发送到Google|如何使用DTM将App事件发送到Google Analytics
- docker|使用 GB28181.Solution + ZLMediaKit + MediaServerUI 进行摄像头推流和播放
- Vue中this.$nextTick()的理解与使用方法
- Mybatis如何使用正则模糊匹配多个数据