Spring usa el modo de estrategia para implementar múltiples métodos de inicio de sesión de escenarios (modo de estrategia)

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);

}

Supongo que te gusta

Origin blog.csdn.net/qq_44961149/article/details/112360220
Recomendado
Clasificación