Spring usa el modo de estrategia para implementar múltiples métodos de inicio de sesión de escenarios
La anotación @Autowired puede ayudarnos a inyectar automáticamente los beans que queramos.
Si simplemente usa @Autowired, encontrará múltiples implementaciones de una interfaz en el contenedor Spring IOC. Spring no puede identificar la clase de implementación específica. Si no es un modo de estrategia, podemos especificar específicamente @Qualifier y @primary para evitar conflictos de beans. Caso. Pero esto no es posible en el modo estrategia.
Además de esta función básica, @Autowired también tiene funciones más potentes: también puede inyectar matrices de tipos específicos, colecciones List/Set e incluso objetos Map.
Simule ejemplos de inicio de sesión en varios escenarios (adecuados para cualquier modo de estrategia: múltiples métodos de pago, etc.)
Se agrega un número a cada clase de implementación específica para una fácil identificación. La clase de implementación específica se puede seleccionar según el escenario. Esto es solo una simulación.
Servicio de inicio de sesión
@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);
}
}
}
Interfaz de política de código fuente
@Component
public interface Login {
User login(User userLogin);
Integer channel();
}
Clase de implementación específica: inicio de sesión con contraseña de usuario
@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;
}
}
Clase de implementación específica: inicio de sesión por correo electrónico
@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;
}
}
Clase de implementación específica: inicio de sesión por correo electrónico
@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;
}
}
Simulación simple de inicio de sesió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);
}