Spring はストラテジー モードを使用して複数のシナリオ ログイン メソッドを実装します。
@Autowired アノテーションは、必要な Bean を自動的に注入するのに役立ちます。
単純に @Autowired を使用する場合、Spring IOC コンテナでインターフェイスの複数の実装が発生します。Spring では特定の実装クラスを識別できません。戦略モードでない場合は、Bean の競合を避けるために @Qualifier と @primary を明確に指定できます。 . ケース。ただし、ストラテジーモードではこれは不可能です。
この基本的な機能に加えて、@Autowired にはさらに強力な機能もあり、指定された型の配列、List/Set コレクション、さらには Map オブジェクトを挿入することもできます。
さまざまなシナリオでログイン例をシミュレートします (複数の支払い方法など、あらゆる戦略モードに適しています)
特定の実装クラスには、識別しやすいように番号が付けられています。シナリオに応じて特定の実装クラスを選択できます。これは単なるシミュレーションです。
ログインサービス
@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);
}