淺談spring使用策略模式實(shí)現(xiàn)多種場(chǎng)景登錄方式
?@Autowired注解可以幫我們自動(dòng)注入我們想要的 Bean。
如果只是簡(jiǎn)單使用@Autowired會(huì)遇到spring IOC容器中一個(gè)接口有多個(gè)實(shí)現(xiàn)的情況,spring無法識(shí)別具體的實(shí)現(xiàn)類,如果不是策略模式,我們可以進(jìn)行具體的指定@Qualifier和@primary來避免bean沖突的情況。但在策略模式中是不行的。
而除了這個(gè)基本功能之外, @Autowired 還有更加強(qiáng)大的功能,還可以注入指定類型的數(shù)組,List/Set 集合,甚至還可以是 Map 對(duì)象。
為每個(gè)具體的實(shí)現(xiàn)類添加了一個(gè)編號(hào),方便識(shí)別,具體可以根據(jù)場(chǎng)景選擇,這里只是模擬。
登錄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(); }
具體實(shí)現(xiàn)類---用戶密碼登錄
@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; } }
具體實(shí)現(xiàn)類---郵箱登錄
@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; } }
具體實(shí)現(xiàn)類---郵箱登錄
@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; } }
簡(jiǎn)單模擬登錄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); }
到此這篇關(guān)于spring使用策略模式實(shí)現(xiàn)多種場(chǎng)景登錄方式的文章就介紹到這了,更多相關(guān)spring 策略模式登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析java并發(fā)編程中volatile的實(shí)現(xiàn)原理
這篇文章主要介紹了深入分析java并發(fā)編程中Volatile的實(shí)現(xiàn)原理,涉及Volatile的官方定義,實(shí)現(xiàn)原理,使用優(yōu)化等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11SharedingSphere?自定義脫敏規(guī)則介紹
這篇文章主要介紹了SharedingSphere?自定義脫敏規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12從零開始搭建springboot+springcloud+mybatis本地項(xiàng)目全過程(圖解)
這篇文章主要介紹了從零開始搭建springboot+springcloud+mybatis本地項(xiàng)目全過程(圖解),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java驗(yàn)證日期時(shí)間字符串是否合法的三種方式
判斷日期經(jīng)常合法出現(xiàn)在IO場(chǎng)景下,下面將盡量使用簡(jiǎn)練的思路和代碼呈現(xiàn)給大伙,這篇文章主要給大家介紹了關(guān)于Java驗(yàn)證日期時(shí)間字符串是否合法的三種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11java隨機(jī)數(shù)生產(chǎn)算法實(shí)例
下面小編就為大家?guī)硪黄猨ava隨機(jī)數(shù)生產(chǎn)算法實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10