淺談spring使用策略模式實(shí)現(xiàn)多種場景登錄方式
?@Autowired注解可以幫我們自動注入我們想要的 Bean。
如果只是簡單使用@Autowired會遇到spring IOC容器中一個接口有多個實(shí)現(xiàn)的情況,spring無法識別具體的實(shí)現(xiàn)類,如果不是策略模式,我們可以進(jìn)行具體的指定@Qualifier和@primary來避免bean沖突的情況。但在策略模式中是不行的。
而除了這個基本功能之外, @Autowired 還有更加強(qiáng)大的功能,還可以注入指定類型的數(shù)組,List/Set 集合,甚至還可以是 Map 對象。
為每個具體的實(shí)現(xiàn)類添加了一個編號,方便識別,具體可以根據(jù)場景選擇,這里只是模擬。
登錄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;
}
}
簡單模擬登錄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)多種場景登錄方式的文章就介紹到這了,更多相關(guān)spring 策略模式登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例
這篇文章主要介紹了在項(xiàng)目遷移中,nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
SpringBoot集成Activiti7工作流引擎的示例代碼
本文主要介紹了SpringBoot集成Activiti7工作流引擎的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
SpringBoot整合Swagger3生成接口文檔過程解析
這篇文章主要介紹了SpringBoot整合Swagger3生成接口文檔過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
mybatisPlus使用LocalDateTime轉(zhuǎn)化異常的實(shí)現(xiàn)
本文主要介紹了mybatisPlus使用LocalDateTime轉(zhuǎn)化異常的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽
這篇文章主要為大家詳細(xì)介紹了JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
SpringBoot?緩存預(yù)熱的實(shí)現(xiàn)
本文主要介紹了SpringBoot?緩存預(yù)熱的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2007-11-11
java簡單實(shí)現(xiàn)復(fù)制 粘貼 剪切功能代碼分享
本文給大家分享了一段java編寫的簡單實(shí)現(xiàn)復(fù)制粘貼剪切功能的代碼,需要的小伙伴可以直接拿走使用。如有更好的方案,也可以告之本人。2014-11-11
深入理解java中的synchronized關(guān)鍵字
這篇文章主要介紹了java中的synchronized關(guān)鍵字,有需要的朋友可以參考一下2013-12-12
MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟
這篇文章主要介紹了MyEclipse2018中安裝Mybatis generator插件的實(shí)現(xiàn)步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02

