1、在spring中怎样实现Context 上下文角色
@Component
public class LoginStrategyFactory implements InitializingBean, ApplicationContextAware {
private final Map<LoginType, LoginService> strategyMap = new ConcurrentHashMap<>();
private ApplicationContext appContext;
@Override
public void afterPropertiesSet() throws Exception {
appContext.getBeansOfType(LoginService.class)
.values().forEach(hander->strategyMap.put(hander.getLoginType(),hander));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appContext = applicationContext;
}
public LoginService getStrategy(LoginType loginType) {
return strategyMap.get(loginType);
}
}
2、 定义策略角色(Strategy)
public interface LoginService {
LoginType getLoginType();
UserDTO login(String username, String password);
}
3、具体策略实现
@Component
@Slf4j
public class PhoneChatLoginStrategy implements LoginService {
@Override
public LoginType getLoginType() {
return LoginType.PHONE;
}
@Override
public UserDTO login(String username, String password) {
log.info("手机登录成功");
return new UserDTO();
}
}
@Component
@Slf4j
public class WeChatLoginStrategy implements LoginService {
@Override
public LoginType getLoginType() {
return LoginType.WE_CHAT;
}
@Override
public UserDTO login(String username, String password) {
log.info("微信登录成功");
return new UserDTO();
}
}
4、使用
public enum LoginType {
QQ,
WE_CHAT,
PHONE;
}
我们这里写了两个登录策略,具体调用:
@RestController
@RequestMapping("/user")
@Slf4j
public class PublicUserController {
@Autowired
private LoginStrategyFactory loginStrategyFactory;
@PostMapping("/login")
public Response<UserDTO> login(@RequestBody @Validated LoginParam loginParam) {
log.info("用户登录:{}",loginParam.getUsername());
LoginService strategy = loginStrategyFactory.getStrategy(loginParam.getLoginType());
UserDTO login = strategy.login(loginParam.getUsername(), loginParam.getPassword());
return new Response<>(login);
}
}